[mapguide-commits] r7477 - in trunk/MgDev: Common/MapGuideCommon/Resources Common/Stylization Desktop/MgDesktop/Services Desktop/MgDesktop/Services/Rendering Desktop/UnitTest Server/src/Core Server/src/PostBuild Server/src/Services/Kml Server/src/Services/Mapping Server/src/Services/Rendering Server/src/UnitTesting UnitTest/TestData/TileService

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Mon May 6 05:46:21 PDT 2013


Author: jng
Date: 2013-05-06 05:46:20 -0700 (Mon, 06 May 2013)
New Revision: 7477

Added:
   trunk/MgDev/Common/Stylization/ExpressionFunctionFeatureSource.cpp
   trunk/MgDev/Common/Stylization/ExpressionFunctionFeatureSource.h
   trunk/MgDev/Common/Stylization/ExpressionFunctionHtmlColor.cpp
   trunk/MgDev/Common/Stylization/ExpressionFunctionHtmlColor.h
   trunk/MgDev/Common/Stylization/ExpressionFunctionLayerDefinition.cpp
   trunk/MgDev/Common/Stylization/ExpressionFunctionLayerDefinition.h
   trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterX.cpp
   trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterX.h
   trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterY.cpp
   trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterY.h
   trunk/MgDev/Common/Stylization/ExpressionFunctionMapScale.cpp
   trunk/MgDev/Common/Stylization/ExpressionFunctionMapScale.h
   trunk/MgDev/UnitTest/TestData/TileService/UT_StylizationFuncs.mdf
   trunk/MgDev/UnitTest/TestData/TileService/UT_VotingDistrictsFunctions.ldf
Modified:
   trunk/MgDev/Common/MapGuideCommon/Resources/mapguide_en.res
   trunk/MgDev/Common/Stylization/ExpressionHelper.cpp
   trunk/MgDev/Common/Stylization/Makefile.am
   trunk/MgDev/Common/Stylization/RendererStyles.h
   trunk/MgDev/Common/Stylization/Stylization.vcxproj
   trunk/MgDev/Common/Stylization/Stylization.vcxproj.filters
   trunk/MgDev/Desktop/MgDesktop/Services/MappingService.cpp
   trunk/MgDev/Desktop/MgDesktop/Services/Rendering/MappingUtil.cpp
   trunk/MgDev/Desktop/MgDesktop/Services/RenderingService.cpp
   trunk/MgDev/Desktop/UnitTest/TestRenderingService.cpp
   trunk/MgDev/Desktop/UnitTest/TestRenderingService.h
   trunk/MgDev/Server/src/Core/Makefile.am
   trunk/MgDev/Server/src/PostBuild/PostBuild.mak
   trunk/MgDev/Server/src/Services/Kml/ServerKmlService.cpp
   trunk/MgDev/Server/src/Services/Mapping/MappingUtil.cpp
   trunk/MgDev/Server/src/Services/Mapping/ServerMappingService.cpp
   trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp
   trunk/MgDev/Server/src/UnitTesting/TestRenderingService.cpp
   trunk/MgDev/Server/src/UnitTesting/TestRenderingService.h
Log:
Merge in sandbox implementation of RFC 133 (Additional Stylization Expression Functions) to trunk. This completes the implementation work.

Modified: trunk/MgDev/Common/MapGuideCommon/Resources/mapguide_en.res
===================================================================
--- trunk/MgDev/Common/MapGuideCommon/Resources/mapguide_en.res	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Common/MapGuideCommon/Resources/mapguide_en.res	2013-05-06 12:46:20 UTC (rev 7477)
@@ -439,17 +439,26 @@
 MgFunctionDECAP_StringValueDescription                = String to format
 MgFunctionFEATURECLASS_Description                    = Returns the active feature class name
 MgFunctionFEATUREID_Description                       = Returns the active feature Id
+MgFunctionFEATURESOURCE_Description                   = Returns the Feature Source resource id where the current feature originates from
+MgFunctionHTMLCOLOR_Description                       = HTML Color generation function
+MgFunctionHTMLCOLOR_RValueDescription                 = Red value
+MgFunctionHTMLCOLOR_GValueDescription                 = Green value
+MgFunctionHTMLCOLOR_BValueDescription                 = Blue value
 MgFunctionIF_Description                              = If evaluator for style theming
 MgFunctionIF_ConditionDescription                     = Boolean expression (filter) encapsulated in a string
 MgFunctionIF_TrueValueDescription                     = Returned if condition is true
 MgFunctionIF_FalseValueDescription                    = Returned if condition is false
 MgFunctionLAYERID_Description                         = Returns the active layer Id
+MgFunctionLAYERDEFINITION_Description                 = Returns the Layer Definition resource id used for stylizing the current feature
 MgFunctionLOOKUP_Description                          = Lookup table for style theming
 MgFunctionLOOKUP_ExpressionDescription                = Key expression
 MgFunctionLOOKUP_DefaultValueDescription              = Default value returned if expression does not evaluate to any of the keys
 MgFunctionLOOKUP_IndexDescription                     = Lookup index that can be matched by the key expression
 MgFunctionLOOKUP_ValueDescription                     = Value that is returned when the key expression matches the associated index
+MgFunctionMAPCENTERX_Description                      = Returns the X coordinate of the view center of the currently rendered map
+MgFunctionMAPCENTERY_Description                      = Returns the Y coordinate of the view center of the currently rendered map
 MgFunctionMAPNAME_Description                         = Returns the active map name
+MgFunctionMAPSCALE_Description                        = Returns the scale of the currently rendered map
 MgFunctionRANGE_Description                           = Range table for style theming
 MgFunctionRANGE_ExpressionDescription                 = Key expression
 MgFunctionRANGE_DefaultValueDescription               = Default value returned if expression does not fall into any of the ranges

Copied: trunk/MgDev/Common/Stylization/ExpressionFunctionFeatureSource.cpp (from rev 7462, sandbox/jng/extra_stylization_funcs/Common/Stylization/ExpressionFunctionFeatureSource.cpp)
===================================================================
--- trunk/MgDev/Common/Stylization/ExpressionFunctionFeatureSource.cpp	                        (rev 0)
+++ trunk/MgDev/Common/Stylization/ExpressionFunctionFeatureSource.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -0,0 +1,91 @@
+//
+//  Copyright (C) 2007-2013 by Autodesk, Inc.
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of version 2.1 of the GNU Lesser
+//  General Public License as published by the Free Software Foundation.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+//
+
+#include "stdafx.h"
+#include "ExpressionFunctionFeatureSource.h"
+#include "Foundation.h"
+
+
+ExpressionFunctionFeatureSource::ExpressionFunctionFeatureSource(const wchar_t* featureSourceId)
+{
+    m_featureSourceIdValue = FdoStringValue::Create(featureSourceId);
+    m_functionDefinition = NULL;
+}
+
+
+ExpressionFunctionFeatureSource::~ExpressionFunctionFeatureSource()
+{
+    FDO_SAFE_RELEASE(m_featureSourceIdValue);
+    FDO_SAFE_RELEASE(m_functionDefinition);
+}
+
+
+ExpressionFunctionFeatureSource* ExpressionFunctionFeatureSource::Create(const wchar_t* featureSourceId)
+{
+    return new ExpressionFunctionFeatureSource(featureSourceId);
+}
+
+
+FdoFunctionDefinition* ExpressionFunctionFeatureSource::GetFunctionDefinition()
+{
+    if (!m_functionDefinition)
+    {
+        STRING funcDesc = MgUtil::GetResourceMessage(MgResources::Stylization, L"MgFunctionFEATURESOURCE_Description");
+
+        FdoPtr<FdoArgumentDefinitionCollection> args = FdoArgumentDefinitionCollection::Create();
+        m_functionDefinition = FdoFunctionDefinition::Create(L"FEATURESOURCE", // NOXLATE
+                                                             funcDesc.c_str(),
+                                                             FdoDataType_String,
+                                                             args,
+                                                             FdoFunctionCategoryType_String,
+                                                             false);
+    }
+
+    return FDO_SAFE_ADDREF(m_functionDefinition);
+}
+
+
+FdoLiteralValue* ExpressionFunctionFeatureSource::Evaluate(FdoLiteralValueCollection* literalValues)
+{
+    // make sure we have zero arguments
+    if (literalValues->GetCount() != 0)
+    {
+        MgResources* resources = MgResources::GetInstance();
+        assert(NULL != resources);
+
+        STRING message = MgUtil::GetResourceMessage(MgResources::Stylization, L"MgIncorrectNumberOfArguments");
+        MgStringCollection arguments;
+        arguments.Add(L"FEATURESOURCE"); // NOXLATE
+        message = resources->FormatMessage(message, &arguments);
+
+        throw FdoExpressionException::Create(message.c_str());
+    }
+
+    return FDO_SAFE_ADDREF(m_featureSourceIdValue);
+}
+
+
+FdoExpressionEngineIFunction* ExpressionFunctionFeatureSource::CreateObject()
+{
+    return ExpressionFunctionFeatureSource::Create(m_featureSourceIdValue->GetString());
+}
+
+
+void ExpressionFunctionFeatureSource::Dispose()
+{
+    delete this;
+}

Copied: trunk/MgDev/Common/Stylization/ExpressionFunctionFeatureSource.h (from rev 7462, sandbox/jng/extra_stylization_funcs/Common/Stylization/ExpressionFunctionFeatureSource.h)
===================================================================
--- trunk/MgDev/Common/Stylization/ExpressionFunctionFeatureSource.h	                        (rev 0)
+++ trunk/MgDev/Common/Stylization/ExpressionFunctionFeatureSource.h	2013-05-06 12:46:20 UTC (rev 7477)
@@ -0,0 +1,51 @@
+//
+//  Copyright (C) 2007-2013 by Autodesk, Inc.
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of version 2.1 of the GNU Lesser
+//  General Public License as published by the Free Software Foundation.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+//
+
+#ifndef EXPRESSION_FUNCTION_FEATURESOURCE_H_
+#define EXPRESSION_FUNCTION_FEATURESOURCE_H_
+
+#include "Stylization.h"
+
+class ExpressionFunctionFeatureSource : public FdoExpressionEngineINonAggregateFunction
+{
+public:
+    ExpressionFunctionFeatureSource(const wchar_t* featureSourceId);
+    ~ExpressionFunctionFeatureSource();
+
+    static ExpressionFunctionFeatureSource* Create(const wchar_t* featureSourceId);
+
+    //--------------------------------------------
+    // FdoExpressionEngineINonAggregateFunction implementation
+    //--------------------------------------------
+    virtual FdoLiteralValue* Evaluate(FdoLiteralValueCollection* literalValues);
+
+    //--------------------------------------------
+    // FdoExpressionEngineIFunction implementation
+    //--------------------------------------------
+    virtual FdoFunctionDefinition* GetFunctionDefinition();
+    virtual FdoExpressionEngineIFunction* CreateObject();
+
+    //--------------------------------------------
+    // FdoIDisposable implementation
+    //--------------------------------------------
+    virtual void Dispose();
+
+private:
+    FdoStringValue* m_featureSourceIdValue;
+    FdoFunctionDefinition* m_functionDefinition;
+};
+#endif

Copied: trunk/MgDev/Common/Stylization/ExpressionFunctionHtmlColor.cpp (from rev 7462, sandbox/jng/extra_stylization_funcs/Common/Stylization/ExpressionFunctionHtmlColor.cpp)
===================================================================
--- trunk/MgDev/Common/Stylization/ExpressionFunctionHtmlColor.cpp	                        (rev 0)
+++ trunk/MgDev/Common/Stylization/ExpressionFunctionHtmlColor.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -0,0 +1,127 @@
+//
+//  Copyright (C) 2007-2013 by Autodesk, Inc.
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of version 2.1 of the GNU Lesser
+//  General Public License as published by the Free Software Foundation.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+//
+
+#include "stdafx.h"
+#include "ExpressionFunctionHtmlColor.h"
+#include "ExpressionHelper.h"
+#include "Foundation.h"
+
+
+ExpressionFunctionHtmlColor::ExpressionFunctionHtmlColor()
+{
+    m_htmlColorValue = FdoStringValue::Create();
+    m_functionDefinition = NULL;
+}
+
+
+ExpressionFunctionHtmlColor::~ExpressionFunctionHtmlColor()
+{
+    FDO_SAFE_RELEASE(m_htmlColorValue);
+    FDO_SAFE_RELEASE(m_functionDefinition);
+}
+
+
+ExpressionFunctionHtmlColor* ExpressionFunctionHtmlColor::Create()
+{
+    return new ExpressionFunctionHtmlColor();
+}
+
+
+FdoFunctionDefinition* ExpressionFunctionHtmlColor::GetFunctionDefinition()
+{
+    if (!m_functionDefinition)
+    {
+        STRING funcDesc = MgUtil::GetResourceMessage(MgResources::Stylization, L"MgFunctionHTMLCOLOR_Description");
+        STRING rValDesc = MgUtil::GetResourceMessage(MgResources::Stylization, L"MgFunctionHTMLCOLOR_RValueDescription");
+        STRING gValDesc = MgUtil::GetResourceMessage(MgResources::Stylization, L"MgFunctionHTMLCOLOR_GValueDescription");
+        STRING bValDesc = MgUtil::GetResourceMessage(MgResources::Stylization, L"MgFunctionHTMLCOLOR_BValueDescription");
+
+        FdoPtr<FdoArgumentDefinition> arg1 = FdoArgumentDefinition::Create(L"rValue", rValDesc.c_str(), FdoDataType_Int32); // NOXLATE
+        FdoPtr<FdoArgumentDefinition> arg2 = FdoArgumentDefinition::Create(L"gValue", gValDesc.c_str(), FdoDataType_Int32); // NOXLATE
+        FdoPtr<FdoArgumentDefinition> arg3 = FdoArgumentDefinition::Create(L"bValue", bValDesc.c_str(), FdoDataType_Int32); // NOXLATE
+
+        FdoPtr<FdoArgumentDefinitionCollection> args = FdoArgumentDefinitionCollection::Create();
+        args->Add(arg1);
+        args->Add(arg2);
+        args->Add(arg3);
+
+        m_functionDefinition = FdoFunctionDefinition::Create(L"HTMLCOLOR", // NOXLATE
+                                                             funcDesc.c_str(),
+                                                             FdoDataType_Int32,
+                                                             args,
+                                                             FdoFunctionCategoryType_String,
+                                                             false);
+    }
+
+    return FDO_SAFE_ADDREF(m_functionDefinition);
+}
+
+
+FdoLiteralValue* ExpressionFunctionHtmlColor::Evaluate(FdoLiteralValueCollection* literalValues)
+{
+    // make sure we have three arguments
+    if (literalValues->GetCount() != 3)
+    {
+        MgResources* resources = MgResources::GetInstance();
+        assert(NULL != resources);
+
+        STRING message = MgUtil::GetResourceMessage(MgResources::Stylization, L"MgIncorrectNumberOfArguments");
+        MgStringCollection arguments;
+        arguments.Add(L"HTMLCOLOR"); // NOXLATE
+        message = resources->FormatMessage(message, &arguments);
+
+        throw FdoExpressionException::Create(message.c_str());
+    }
+
+    FdoPtr<FdoLiteralValue> arg1 = literalValues->GetItem(0);
+    FdoPtr<FdoLiteralValue> arg2 = literalValues->GetItem(1);
+    FdoPtr<FdoLiteralValue> arg3 = literalValues->GetItem(2);
+
+    FdoInt32   red = ExpressionHelper::GetAsInt32(arg1);
+    FdoInt32 green = ExpressionHelper::GetAsInt32(arg2);
+    FdoInt32  blue = ExpressionHelper::GetAsInt32(arg3);
+
+    // clean up
+    red   &= 0xFF;
+    green &= 0xFF;
+    blue  &= 0xFF;
+
+    wchar_t tmp[32] = { 0 };
+    std::wstring str;
+    swprintf(tmp, 32, L"%0.2x", red);
+    str.append(&tmp[0]);
+    swprintf(tmp, 32, L"%0.2x", green);
+    str.append(&tmp[0]);
+    swprintf(tmp, 32, L"%0.2x", blue);
+    str.append(&tmp[0]);
+
+    m_htmlColorValue->SetString(str.c_str());
+
+    return FDO_SAFE_ADDREF(m_htmlColorValue);
+}
+
+
+FdoExpressionEngineIFunction* ExpressionFunctionHtmlColor::CreateObject()
+{
+    return ExpressionFunctionHtmlColor::Create();
+}
+
+
+void ExpressionFunctionHtmlColor::Dispose()
+{
+    delete this;
+}

Copied: trunk/MgDev/Common/Stylization/ExpressionFunctionHtmlColor.h (from rev 7462, sandbox/jng/extra_stylization_funcs/Common/Stylization/ExpressionFunctionHtmlColor.h)
===================================================================
--- trunk/MgDev/Common/Stylization/ExpressionFunctionHtmlColor.h	                        (rev 0)
+++ trunk/MgDev/Common/Stylization/ExpressionFunctionHtmlColor.h	2013-05-06 12:46:20 UTC (rev 7477)
@@ -0,0 +1,52 @@
+//
+//  Copyright (C) 2007-2013 by Autodesk, Inc.
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of version 2.1 of the GNU Lesser
+//  General Public License as published by the Free Software Foundation.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+//
+
+#ifndef EXPRESSION_FUNCTION_HTMLCOLOR_H_
+#define EXPRESSION_FUNCTION_HTMLCOLOR_H_
+
+#include "Stylization.h"
+
+class ExpressionFunctionHtmlColor : public FdoExpressionEngineINonAggregateFunction
+{
+public:
+    ExpressionFunctionHtmlColor();
+    ~ExpressionFunctionHtmlColor();
+
+    static ExpressionFunctionHtmlColor* Create();
+
+    //--------------------------------------------
+    // FdoExpressionEngineINonAggregateFunction implementation
+    //--------------------------------------------
+    virtual FdoLiteralValue* Evaluate(FdoLiteralValueCollection* literalValues);
+
+    //--------------------------------------------
+    // FdoExpressionEngineIFunction implementation
+    //--------------------------------------------
+    virtual FdoFunctionDefinition* GetFunctionDefinition();
+    virtual FdoExpressionEngineIFunction* CreateObject();
+
+    //--------------------------------------------
+    // FdoIDisposable implementation
+    //--------------------------------------------
+    virtual void Dispose();
+
+private:
+    FdoStringValue* m_htmlColorValue;
+    FdoFunctionDefinition* m_functionDefinition;
+};
+
+#endif
\ No newline at end of file

Copied: trunk/MgDev/Common/Stylization/ExpressionFunctionLayerDefinition.cpp (from rev 7462, sandbox/jng/extra_stylization_funcs/Common/Stylization/ExpressionFunctionLayerDefinition.cpp)
===================================================================
--- trunk/MgDev/Common/Stylization/ExpressionFunctionLayerDefinition.cpp	                        (rev 0)
+++ trunk/MgDev/Common/Stylization/ExpressionFunctionLayerDefinition.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -0,0 +1,91 @@
+//
+//  Copyright (C) 2007-2013 by Autodesk, Inc.
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of version 2.1 of the GNU Lesser
+//  General Public License as published by the Free Software Foundation.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+//
+
+#include "stdafx.h"
+#include "ExpressionFunctionLayerDefinition.h"
+#include "Foundation.h"
+
+
+ExpressionFunctionLayerDefinition::ExpressionFunctionLayerDefinition(const wchar_t* layerDefinitionId)
+{
+    m_layerDefinitionIdValue = FdoStringValue::Create(layerDefinitionId);
+    m_functionDefinition = NULL;
+}
+
+
+ExpressionFunctionLayerDefinition::~ExpressionFunctionLayerDefinition()
+{
+    FDO_SAFE_RELEASE(m_layerDefinitionIdValue);
+    FDO_SAFE_RELEASE(m_functionDefinition);
+}
+
+
+ExpressionFunctionLayerDefinition* ExpressionFunctionLayerDefinition::Create(const wchar_t* layerDefinitionId)
+{
+    return new ExpressionFunctionLayerDefinition(layerDefinitionId);
+}
+
+
+FdoFunctionDefinition* ExpressionFunctionLayerDefinition::GetFunctionDefinition()
+{
+    if (!m_functionDefinition)
+    {
+        STRING funcDesc = MgUtil::GetResourceMessage(MgResources::Stylization, L"MgFunctionLAYERDEFINITION_Description");
+
+        FdoPtr<FdoArgumentDefinitionCollection> args = FdoArgumentDefinitionCollection::Create();
+        m_functionDefinition = FdoFunctionDefinition::Create(L"LAYERDEFINITION", // NOXLATE
+                                                             funcDesc.c_str(),
+                                                             FdoDataType_String,
+                                                             args,
+                                                             FdoFunctionCategoryType_String,
+                                                             false);
+    }
+
+    return FDO_SAFE_ADDREF(m_functionDefinition);
+}
+
+
+FdoLiteralValue* ExpressionFunctionLayerDefinition::Evaluate(FdoLiteralValueCollection* literalValues)
+{
+    // make sure we have zero arguments
+    if (literalValues->GetCount() != 0)
+    {
+        MgResources* resources = MgResources::GetInstance();
+        assert(NULL != resources);
+
+        STRING message = MgUtil::GetResourceMessage(MgResources::Stylization, L"MgIncorrectNumberOfArguments");
+        MgStringCollection arguments;
+        arguments.Add(L"LAYERDEFINITION"); // NOXLATE
+        message = resources->FormatMessage(message, &arguments);
+
+        throw FdoExpressionException::Create(message.c_str());
+    }
+
+    return FDO_SAFE_ADDREF(m_layerDefinitionIdValue);
+}
+
+
+FdoExpressionEngineIFunction* ExpressionFunctionLayerDefinition::CreateObject()
+{
+    return ExpressionFunctionLayerDefinition::Create(m_layerDefinitionIdValue->GetString());
+}
+
+
+void ExpressionFunctionLayerDefinition::Dispose()
+{
+    delete this;
+}

Copied: trunk/MgDev/Common/Stylization/ExpressionFunctionLayerDefinition.h (from rev 7462, sandbox/jng/extra_stylization_funcs/Common/Stylization/ExpressionFunctionLayerDefinition.h)
===================================================================
--- trunk/MgDev/Common/Stylization/ExpressionFunctionLayerDefinition.h	                        (rev 0)
+++ trunk/MgDev/Common/Stylization/ExpressionFunctionLayerDefinition.h	2013-05-06 12:46:20 UTC (rev 7477)
@@ -0,0 +1,51 @@
+//
+//  Copyright (C) 2007-2013 by Autodesk, Inc.
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of version 2.1 of the GNU Lesser
+//  General Public License as published by the Free Software Foundation.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+//
+
+#ifndef EXPRESSION_FUNCTION_LAYERDEFINITION_H_
+#define EXPRESSION_FUNCTION_LAYERDEFINITION_H_
+
+#include "Stylization.h"
+
+class ExpressionFunctionLayerDefinition : public FdoExpressionEngineINonAggregateFunction
+{
+public:
+    ExpressionFunctionLayerDefinition(const wchar_t* layerDefinitionId);
+    ~ExpressionFunctionLayerDefinition();
+
+    static ExpressionFunctionLayerDefinition* Create(const wchar_t* layerDefinitionId);
+
+    //--------------------------------------------
+    // FdoExpressionEngineINonAggregateFunction implementation
+    //--------------------------------------------
+    virtual FdoLiteralValue* Evaluate(FdoLiteralValueCollection* literalValues);
+
+    //--------------------------------------------
+    // FdoExpressionEngineIFunction implementation
+    //--------------------------------------------
+    virtual FdoFunctionDefinition* GetFunctionDefinition();
+    virtual FdoExpressionEngineIFunction* CreateObject();
+
+    //--------------------------------------------
+    // FdoIDisposable implementation
+    //--------------------------------------------
+    virtual void Dispose();
+
+private:
+    FdoStringValue* m_layerDefinitionIdValue;
+    FdoFunctionDefinition* m_functionDefinition;
+};
+#endif

Copied: trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterX.cpp (from rev 7462, sandbox/jng/extra_stylization_funcs/Common/Stylization/ExpressionFunctionMapCenterX.cpp)
===================================================================
--- trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterX.cpp	                        (rev 0)
+++ trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterX.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -0,0 +1,91 @@
+//
+//  Copyright (C) 2007-2013 by Autodesk, Inc.
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of version 2.1 of the GNU Lesser
+//  General Public License as published by the Free Software Foundation.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+//
+
+#include "stdafx.h"
+#include "ExpressionFunctionMapCenterX.h"
+#include "Foundation.h"
+
+
+ExpressionFunctionMapCenterX::ExpressionFunctionMapCenterX(const double xValue)
+{
+    m_xValue = FdoDoubleValue::Create(xValue);
+    m_functionDefinition = NULL;
+}
+
+
+ExpressionFunctionMapCenterX::~ExpressionFunctionMapCenterX()
+{
+    FDO_SAFE_RELEASE(m_xValue);
+    FDO_SAFE_RELEASE(m_functionDefinition);
+}
+
+
+ExpressionFunctionMapCenterX* ExpressionFunctionMapCenterX::Create(const double xValue)
+{
+    return new ExpressionFunctionMapCenterX(xValue);
+}
+
+
+FdoFunctionDefinition* ExpressionFunctionMapCenterX::GetFunctionDefinition()
+{
+    if (!m_functionDefinition)
+    {
+        STRING funcDesc = MgUtil::GetResourceMessage(MgResources::Stylization, L"MgFunctionMAPCENTERX_Description");
+
+        FdoPtr<FdoArgumentDefinitionCollection> args = FdoArgumentDefinitionCollection::Create();
+        m_functionDefinition = FdoFunctionDefinition::Create(L"MAPCENTERX", // NOXLATE
+                                                             funcDesc.c_str(),
+                                                             FdoDataType_Double,
+                                                             args,
+                                                             FdoFunctionCategoryType_Numeric,
+                                                             false);
+    }
+
+    return FDO_SAFE_ADDREF(m_functionDefinition);
+}
+
+
+FdoLiteralValue* ExpressionFunctionMapCenterX::Evaluate(FdoLiteralValueCollection* literalValues)
+{
+    // make sure we have zero arguments
+    if (literalValues->GetCount() != 0)
+    {
+        MgResources* resources = MgResources::GetInstance();
+        assert(NULL != resources);
+
+        STRING message = MgUtil::GetResourceMessage(MgResources::Stylization, L"MgIncorrectNumberOfArguments");
+        MgStringCollection arguments;
+        arguments.Add(L"MAPCENTERX"); // NOXLATE
+        message = resources->FormatMessage(message, &arguments);
+
+        throw FdoExpressionException::Create(message.c_str());
+    }
+
+    return FDO_SAFE_ADDREF(m_xValue);
+}
+
+
+FdoExpressionEngineIFunction* ExpressionFunctionMapCenterX::CreateObject()
+{
+    return ExpressionFunctionMapCenterX::Create(m_xValue->GetDouble());
+}
+
+
+void ExpressionFunctionMapCenterX::Dispose()
+{
+    delete this;
+}

Copied: trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterX.h (from rev 7462, sandbox/jng/extra_stylization_funcs/Common/Stylization/ExpressionFunctionMapCenterX.h)
===================================================================
--- trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterX.h	                        (rev 0)
+++ trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterX.h	2013-05-06 12:46:20 UTC (rev 7477)
@@ -0,0 +1,52 @@
+//
+//  Copyright (C) 2007-2013 by Autodesk, Inc.
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of version 2.1 of the GNU Lesser
+//  General Public License as published by the Free Software Foundation.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+//
+
+#ifndef EXPRESSION_FUNCTION_MAPCENTERX_H_
+#define EXPRESSION_FUNCTION_MAPCENTERX_H_
+
+#include "Stylization.h"
+
+class ExpressionFunctionMapCenterX : public FdoExpressionEngineINonAggregateFunction
+{
+public:
+    ExpressionFunctionMapCenterX(const double xValue);
+    ~ExpressionFunctionMapCenterX();
+
+    static ExpressionFunctionMapCenterX* Create(const double xValue);
+
+    //--------------------------------------------
+    // FdoExpressionEngineINonAggregateFunction implementation
+    //--------------------------------------------
+    virtual FdoLiteralValue* Evaluate(FdoLiteralValueCollection* literalValues);
+
+    //--------------------------------------------
+    // FdoExpressionEngineIFunction implementation
+    //--------------------------------------------
+    virtual FdoFunctionDefinition* GetFunctionDefinition();
+    virtual FdoExpressionEngineIFunction* CreateObject();
+
+    //--------------------------------------------
+    // FdoIDisposable implementation
+    //--------------------------------------------
+    virtual void Dispose();
+
+private:
+    FdoDoubleValue* m_xValue;
+    FdoFunctionDefinition* m_functionDefinition;
+};
+
+#endif

Copied: trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterY.cpp (from rev 7462, sandbox/jng/extra_stylization_funcs/Common/Stylization/ExpressionFunctionMapCenterY.cpp)
===================================================================
--- trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterY.cpp	                        (rev 0)
+++ trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterY.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -0,0 +1,91 @@
+//
+//  Copyright (C) 2007-2013 by Autodesk, Inc.
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of version 2.1 of the GNU Lesser
+//  General Public License as published by the Free Software Foundation.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+//
+
+#include "stdafx.h"
+#include "ExpressionFunctionMapCenterY.h"
+#include "Foundation.h"
+
+
+ExpressionFunctionMapCenterY::ExpressionFunctionMapCenterY(const double yValue)
+{
+    m_yValue = FdoDoubleValue::Create(yValue);
+    m_functionDefinition = NULL;
+}
+
+
+ExpressionFunctionMapCenterY::~ExpressionFunctionMapCenterY()
+{
+    FDO_SAFE_RELEASE(m_yValue);
+    FDO_SAFE_RELEASE(m_functionDefinition);
+}
+
+
+ExpressionFunctionMapCenterY* ExpressionFunctionMapCenterY::Create(const double yValue)
+{
+    return new ExpressionFunctionMapCenterY(yValue);
+}
+
+
+FdoFunctionDefinition* ExpressionFunctionMapCenterY::GetFunctionDefinition()
+{
+    if (!m_functionDefinition)
+    {
+        STRING funcDesc = MgUtil::GetResourceMessage(MgResources::Stylization, L"MgFunctionMAPCENTERY_Description");
+
+        FdoPtr<FdoArgumentDefinitionCollection> args = FdoArgumentDefinitionCollection::Create();
+        m_functionDefinition = FdoFunctionDefinition::Create(L"MAPCENTERY", // NOXLATE
+                                                             funcDesc.c_str(),
+                                                             FdoDataType_Double,
+                                                             args,
+                                                             FdoFunctionCategoryType_Numeric,
+                                                             false);
+    }
+
+    return FDO_SAFE_ADDREF(m_functionDefinition);
+}
+
+
+FdoLiteralValue* ExpressionFunctionMapCenterY::Evaluate(FdoLiteralValueCollection* literalValues)
+{
+    // make sure we have zero arguments
+    if (literalValues->GetCount() != 0)
+    {
+        MgResources* resources = MgResources::GetInstance();
+        assert(NULL != resources);
+
+        STRING message = MgUtil::GetResourceMessage(MgResources::Stylization, L"MgIncorrectNumberOfArguments");
+        MgStringCollection arguments;
+        arguments.Add(L"MAPCENTERY"); // NOXLATE
+        message = resources->FormatMessage(message, &arguments);
+
+        throw FdoExpressionException::Create(message.c_str());
+    }
+
+    return FDO_SAFE_ADDREF(m_yValue);
+}
+
+
+FdoExpressionEngineIFunction* ExpressionFunctionMapCenterY::CreateObject()
+{
+    return ExpressionFunctionMapCenterY::Create(m_yValue->GetDouble());
+}
+
+
+void ExpressionFunctionMapCenterY::Dispose()
+{
+    delete this;
+}

Copied: trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterY.h (from rev 7462, sandbox/jng/extra_stylization_funcs/Common/Stylization/ExpressionFunctionMapCenterY.h)
===================================================================
--- trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterY.h	                        (rev 0)
+++ trunk/MgDev/Common/Stylization/ExpressionFunctionMapCenterY.h	2013-05-06 12:46:20 UTC (rev 7477)
@@ -0,0 +1,52 @@
+//
+//  Copyright (C) 2007-2013 by Autodesk, Inc.
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of version 2.1 of the GNU Lesser
+//  General Public License as published by the Free Software Foundation.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+//
+
+#ifndef EXPRESSION_FUNCTION_MAPCENTERY_H_
+#define EXPRESSION_FUNCTION_MAPCENTERY_H_
+
+#include "Stylization.h"
+
+class ExpressionFunctionMapCenterY : public FdoExpressionEngineINonAggregateFunction
+{
+public:
+    ExpressionFunctionMapCenterY(const double yValue);
+    ~ExpressionFunctionMapCenterY();
+
+    static ExpressionFunctionMapCenterY* Create(const double yValue);
+
+    //--------------------------------------------
+    // FdoExpressionEngineINonAggregateFunction implementation
+    //--------------------------------------------
+    virtual FdoLiteralValue* Evaluate(FdoLiteralValueCollection* literalValues);
+
+    //--------------------------------------------
+    // FdoExpressionEngineIFunction implementation
+    //--------------------------------------------
+    virtual FdoFunctionDefinition* GetFunctionDefinition();
+    virtual FdoExpressionEngineIFunction* CreateObject();
+
+    //--------------------------------------------
+    // FdoIDisposable implementation
+    //--------------------------------------------
+    virtual void Dispose();
+
+private:
+    FdoDoubleValue* m_yValue;
+    FdoFunctionDefinition* m_functionDefinition;
+};
+
+#endif

Copied: trunk/MgDev/Common/Stylization/ExpressionFunctionMapScale.cpp (from rev 7462, sandbox/jng/extra_stylization_funcs/Common/Stylization/ExpressionFunctionMapScale.cpp)
===================================================================
--- trunk/MgDev/Common/Stylization/ExpressionFunctionMapScale.cpp	                        (rev 0)
+++ trunk/MgDev/Common/Stylization/ExpressionFunctionMapScale.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -0,0 +1,91 @@
+//
+//  Copyright (C) 2007-2013 by Autodesk, Inc.
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of version 2.1 of the GNU Lesser
+//  General Public License as published by the Free Software Foundation.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+//
+
+#include "stdafx.h"
+#include "ExpressionFunctionMapScale.h"
+#include "Foundation.h"
+
+
+ExpressionFunctionMapScale::ExpressionFunctionMapScale(const double scaleValue)
+{
+    m_scaleValue = FdoDoubleValue::Create(scaleValue);
+    m_functionDefinition = NULL;
+}
+
+
+ExpressionFunctionMapScale::~ExpressionFunctionMapScale()
+{
+    FDO_SAFE_RELEASE(m_scaleValue);
+    FDO_SAFE_RELEASE(m_functionDefinition);
+}
+
+
+ExpressionFunctionMapScale* ExpressionFunctionMapScale::Create(const double scaleValue)
+{
+    return new ExpressionFunctionMapScale(scaleValue);
+}
+
+
+FdoFunctionDefinition* ExpressionFunctionMapScale::GetFunctionDefinition()
+{
+    if (!m_functionDefinition)
+    {
+        STRING funcDesc = MgUtil::GetResourceMessage(MgResources::Stylization, L"MgFunctionMAPSCALE_Description");
+
+        FdoPtr<FdoArgumentDefinitionCollection> args = FdoArgumentDefinitionCollection::Create();
+        m_functionDefinition = FdoFunctionDefinition::Create(L"MAPSCALE", // NOXLATE
+                                                             funcDesc.c_str(),
+                                                             FdoDataType_Double,
+                                                             args,
+                                                             FdoFunctionCategoryType_Numeric,
+                                                             false);
+    }
+
+    return FDO_SAFE_ADDREF(m_functionDefinition);
+}
+
+
+FdoLiteralValue* ExpressionFunctionMapScale::Evaluate(FdoLiteralValueCollection* literalValues)
+{
+    // make sure we have zero arguments
+    if (literalValues->GetCount() != 0)
+    {
+        MgResources* resources = MgResources::GetInstance();
+        assert(NULL != resources);
+
+        STRING message = MgUtil::GetResourceMessage(MgResources::Stylization, L"MgIncorrectNumberOfArguments");
+        MgStringCollection arguments;
+        arguments.Add(L"MAPSCALE"); // NOXLATE
+        message = resources->FormatMessage(message, &arguments);
+
+        throw FdoExpressionException::Create(message.c_str());
+    }
+
+    return FDO_SAFE_ADDREF(m_scaleValue);
+}
+
+
+FdoExpressionEngineIFunction* ExpressionFunctionMapScale::CreateObject()
+{
+    return ExpressionFunctionMapScale::Create(m_scaleValue->GetDouble());
+}
+
+
+void ExpressionFunctionMapScale::Dispose()
+{
+    delete this;
+}

Copied: trunk/MgDev/Common/Stylization/ExpressionFunctionMapScale.h (from rev 7462, sandbox/jng/extra_stylization_funcs/Common/Stylization/ExpressionFunctionMapScale.h)
===================================================================
--- trunk/MgDev/Common/Stylization/ExpressionFunctionMapScale.h	                        (rev 0)
+++ trunk/MgDev/Common/Stylization/ExpressionFunctionMapScale.h	2013-05-06 12:46:20 UTC (rev 7477)
@@ -0,0 +1,52 @@
+//
+//  Copyright (C) 2007-2013 by Autodesk, Inc.
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of version 2.1 of the GNU Lesser
+//  General Public License as published by the Free Software Foundation.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
+//
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+//
+
+#ifndef EXPRESSION_FUNCTION_MAPCENTERSCALE_H_
+#define EXPRESSION_FUNCTION_MAPCENTERSCALE_H_
+
+#include "Stylization.h"
+
+class ExpressionFunctionMapScale : public FdoExpressionEngineINonAggregateFunction
+{
+public:
+    ExpressionFunctionMapScale(const double scaleValue);
+    ~ExpressionFunctionMapScale();
+
+    static ExpressionFunctionMapScale* Create(const double scaleValue);
+
+    //--------------------------------------------
+    // FdoExpressionEngineINonAggregateFunction implementation
+    //--------------------------------------------
+    virtual FdoLiteralValue* Evaluate(FdoLiteralValueCollection* literalValues);
+
+    //--------------------------------------------
+    // FdoExpressionEngineIFunction implementation
+    //--------------------------------------------
+    virtual FdoFunctionDefinition* GetFunctionDefinition();
+    virtual FdoExpressionEngineIFunction* CreateObject();
+
+    //--------------------------------------------
+    // FdoIDisposable implementation
+    //--------------------------------------------
+    virtual void Dispose();
+
+private:
+    FdoDoubleValue* m_scaleValue;
+    FdoFunctionDefinition* m_functionDefinition;
+};
+
+#endif
\ No newline at end of file

Modified: trunk/MgDev/Common/Stylization/ExpressionHelper.cpp
===================================================================
--- trunk/MgDev/Common/Stylization/ExpressionHelper.cpp	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Common/Stylization/ExpressionHelper.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -21,14 +21,22 @@
 #include "ExpressionFunctionDecap.h"
 #include "ExpressionFunctionFeatureClass.h"
 #include "ExpressionFunctionFeatureId.h"
+#include "ExpressionFunctionFeatureSource.h"
+#include "ExpressionFunctionHtmlColor.h"
 #include "ExpressionFunctionLayerId.h"
+#include "ExpressionFunctionLayerDefinition.h"
+#include "ExpressionFunctionMapCenterX.h"
+#include "ExpressionFunctionMapCenterY.h"
 #include "ExpressionFunctionMapName.h"
+#include "ExpressionFunctionMapScale.h"
 #include "ExpressionFunctionSession.h"
 #include "ExpressionFunctionUrlEncode.h"
 #include "ExpressionFunctionIf.h"
 #include "ExpressionFunctionLookup.h"
 #include "ExpressionFunctionRange.h"
 
+
+
 #include "RS_FeatureReader.h"
 
 
@@ -45,7 +53,15 @@
     // common functions
     RS_FeatureClassInfo* featInfo = renderer? renderer->GetFeatureClassInfo() : NULL;
     const RS_String& featCls = (featInfo != NULL)? featInfo->name() : s_Empty;
+    const RS_String& featSource = (featInfo != NULL) ? featInfo->source() : s_Empty;
 
+    RS_MapUIInfo* mapInfo = renderer? renderer->GetMapInfo() : NULL;
+    RS_LayerUIInfo* layerInfo = renderer? renderer->GetLayerInfo() : NULL;
+    const double mapScale = (mapInfo != NULL) ? mapInfo->scale() : 0.0;
+    const double mapX = (mapInfo != NULL) ? mapInfo->viewx() : 0.0;
+    const double mapY = (mapInfo != NULL) ? mapInfo->viewy() : 0.0;
+    const RS_String& layerDef = (layerInfo != NULL) ? layerInfo->layerdef() : s_Empty;
+
     FdoPtr<ExpressionFunctionArgb> funcArgb = ExpressionFunctionArgb::Create();
     FdoPtr<ExpressionFunctionDecap> funcDecap = ExpressionFunctionDecap::Create();
     FdoPtr<ExpressionFunctionFeatureClass> funcFeatureClass = ExpressionFunctionFeatureClass::Create(featCls.c_str());
@@ -53,6 +69,11 @@
     FdoPtr<ExpressionFunctionIf> funcIf = ExpressionFunctionIf::Create();
     FdoPtr<ExpressionFunctionLookup> funcLookup = ExpressionFunctionLookup::Create();
     FdoPtr<ExpressionFunctionRange> funcRange = ExpressionFunctionRange::Create();
+    FdoPtr<ExpressionFunctionFeatureSource> funcFeatureSource = ExpressionFunctionFeatureSource::Create(featSource.c_str());
+    FdoPtr<ExpressionFunctionLayerDefinition> funcLayerDefinition = ExpressionFunctionLayerDefinition::Create(layerDef.c_str());
+    FdoPtr<ExpressionFunctionMapCenterX> funcMapCenterX = ExpressionFunctionMapCenterX::Create(mapX);
+    FdoPtr<ExpressionFunctionMapCenterY> funcMapCenterY = ExpressionFunctionMapCenterY::Create(mapY);
+    FdoPtr<ExpressionFunctionMapScale> funcMapScale = ExpressionFunctionMapScale::Create(mapScale);
 
     userDefinedFunctions->Add(funcIf);      // make IF the first one to optimize search in GetExpressionEngine
     userDefinedFunctions->Add(funcArgb);
@@ -61,20 +82,25 @@
     userDefinedFunctions->Add(funcUrlEncode);
     userDefinedFunctions->Add(funcLookup);
     userDefinedFunctions->Add(funcRange);
+    userDefinedFunctions->Add(funcFeatureSource);
+    userDefinedFunctions->Add(funcLayerDefinition);
+    userDefinedFunctions->Add(funcMapCenterX);
+    userDefinedFunctions->Add(funcMapCenterY);
+    userDefinedFunctions->Add(funcMapScale);
 
     // MapGuide-specific functions
 #ifndef MG_EXCLUDE_EXPRESSION_FUNCTIONS
-    RS_MapUIInfo* mapInfo = renderer? renderer->GetMapInfo() : NULL;
-    RS_LayerUIInfo* layerInfo = renderer? renderer->GetLayerInfo() : NULL;
     const RS_String& session = (  mapInfo != NULL)?   mapInfo->session() : s_Empty;
     const RS_String& mapName = (  mapInfo != NULL)?   mapInfo->name()    : s_Empty;
     const RS_String& layerId = (layerInfo != NULL)? layerInfo->guid()    : s_Empty;
 
+    FdoPtr<ExpressionFunctionHtmlColor> funcHtmlColor = ExpressionFunctionHtmlColor::Create();
     FdoPtr<ExpressionFunctionFeatureId> funcFeatureId = ExpressionFunctionFeatureId::Create(reader);
     FdoPtr<ExpressionFunctionLayerId> funcLayerId = ExpressionFunctionLayerId::Create(layerId.c_str());
     FdoPtr<ExpressionFunctionMapName> funcMapName = ExpressionFunctionMapName::Create(mapName.c_str());
     FdoPtr<ExpressionFunctionSession> funcSession = ExpressionFunctionSession::Create(session.c_str());
 
+    userDefinedFunctions->Add(funcHtmlColor);
     userDefinedFunctions->Add(funcFeatureId);
     userDefinedFunctions->Add(funcLayerId);
     userDefinedFunctions->Add(funcMapName);

Modified: trunk/MgDev/Common/Stylization/Makefile.am
===================================================================
--- trunk/MgDev/Common/Stylization/Makefile.am	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Common/Stylization/Makefile.am	2013-05-06 12:46:20 UTC (rev 7477)
@@ -30,10 +30,16 @@
   ExpressionFunctionDecap.cpp \
   ExpressionFunctionFeatureClass.cpp \
   ExpressionFunctionFeatureId.cpp \
+  ExpressionFunctionFeatureSource.cpp \
+  ExpressionFunctionHtmlColor.cpp \
   ExpressionFunctionIf.cpp \
+  ExpressionFunctionLayerDefinition.cpp \
   ExpressionFunctionLayerId.cpp \
   ExpressionFunctionLookup.cpp \
+  ExpressionFunctionMapCenterX.cpp \
+  ExpressionFunctionMapCenterY.cpp \
   ExpressionFunctionMapName.cpp \
+  ExpressionFunctionMapScale.cpp \
   ExpressionFunctionRange.cpp \
   ExpressionFunctionSession.cpp \
   ExpressionFunctionUrlEncode.cpp \
@@ -117,10 +123,16 @@
   ExpressionFunctionDecap.h \
   ExpressionFunctionFeatureClass.h \
   ExpressionFunctionFeatureId.h \
+  ExpressionFunctionFeatureSource.h \
+  ExpressionFunctionHtmlColor.h \
   ExpressionFunctionIf.h \
+  ExpressionFunctionLayerDefinition.h \
   ExpressionFunctionLayerId.h \
   ExpressionFunctionLookup.h \
+  ExpressionFunctionMapCenterX.h \
+  ExpressionFunctionMapCenterY.h \
   ExpressionFunctionMapName.h \
+  ExpressionFunctionMapScale.h \
   ExpressionFunctionRange.h \
   ExpressionFunctionSession.h \
   ExpressionFunctionUrlEncode.h \

Modified: trunk/MgDev/Common/Stylization/RendererStyles.h
===================================================================
--- trunk/MgDev/Common/Stylization/RendererStyles.h	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Common/Stylization/RendererStyles.h	2013-05-06 12:46:20 UTC (rev 7477)
@@ -582,6 +582,7 @@
 public:
     RS_LayerUIInfo() :
         m_name(L""),
+        m_layerdef(L""),
         m_guid(L""),
         m_selectable(true),
         m_visible(true),
@@ -598,6 +599,7 @@
     }
 
     RS_LayerUIInfo(const RS_String& name,
+                   const RS_String& layerdef,
                    const RS_String& guid,
                    bool             selectable,
                    bool             visible,
@@ -611,6 +613,7 @@
                    bool             hastooltips = false,
                    bool             hashyperlinks = false) :
         m_name(name),
+        m_layerdef(layerdef),
         m_guid(guid),
         m_selectable(selectable),
         m_visible(visible),
@@ -627,6 +630,7 @@
     }
 
     inline RS_String&    name()          { return m_name; }
+    inline RS_String&    layerdef()      { return m_layerdef; }
     inline RS_String&    guid()          { return m_guid; }
     inline bool&         selectable()    { return m_selectable; }
     inline bool&         visible()       { return m_visible; }
@@ -642,6 +646,7 @@
 
 private:
     RS_String m_name;
+    RS_String m_layerdef;
     RS_String m_guid;
     bool m_selectable;
     bool m_visible;
@@ -667,7 +672,10 @@
         m_guid(L""),
         m_coordsys(L""),
         m_units(L""),
-        m_bgcolor(255, 255, 255, 255)
+        m_bgcolor(255, 255, 255, 255),
+        m_viewx(0.0),
+        m_viewy(0.0),
+        m_scale(0.0)
     {
     }
 
@@ -676,13 +684,19 @@
                  const RS_String& guid,
                  const RS_String& coordsys,
                  const RS_String& units,
-                 const RS_Color&  bgcolor) :
+                 const RS_Color&  bgcolor,
+                 const double viewx = 0.0,
+                 const double viewy = 0.0,
+                 const double scale = 0.0) :
         m_session(session),
         m_name(name),
         m_guid(guid),
         m_coordsys(coordsys),
         m_units(units),
-        m_bgcolor(bgcolor)
+        m_bgcolor(bgcolor),
+        m_viewx(viewx),
+        m_viewy(viewy),
+        m_scale(scale)
     {
     }
 
@@ -692,6 +706,9 @@
     inline RS_String& coordsys() { return m_coordsys; }
     inline RS_String& units()    { return m_units; }
     inline RS_Color&  bgcolor()  { return m_bgcolor; }
+    inline double&    scale()    { return m_scale; }
+    inline double&    viewx()    { return m_viewx; }
+    inline double&    viewy()    { return m_viewy; }
 
 private:
     RS_String m_session;
@@ -700,6 +717,9 @@
     RS_String m_coordsys;
     RS_String m_units;
     RS_Color  m_bgcolor;
+    double    m_scale;
+    double    m_viewx;
+    double    m_viewy;
 };
 
 
@@ -708,12 +728,12 @@
 {
 public:
     RS_FeatureClassInfo() :
-        m_name(L"")
+        m_name(L""), m_source(L"")
     {
     }
 
-    RS_FeatureClassInfo(const RS_String& name) :
-        m_name(name)
+    RS_FeatureClassInfo(const RS_String& name, const RS_String& source) :
+        m_name(name), m_source(source)
     {
     }
 
@@ -730,8 +750,10 @@
 
     inline RS_String&              name()     { return m_name; }
     inline std::vector<RS_String>& mappings() { return m_propMappings; }
+    inline RS_String&              source()   { return m_source; }
 
 private:
+    RS_String m_source;
     RS_String m_name;
     std::vector<RS_String> m_propMappings;
 };

Modified: trunk/MgDev/Common/Stylization/Stylization.vcxproj
===================================================================
--- trunk/MgDev/Common/Stylization/Stylization.vcxproj	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Common/Stylization/Stylization.vcxproj	2013-05-06 12:46:20 UTC (rev 7477)
@@ -215,10 +215,16 @@
     <ClCompile Include="ExpressionFunctionDecap.cpp" />
     <ClCompile Include="ExpressionFunctionFeatureClass.cpp" />
     <ClCompile Include="ExpressionFunctionFeatureId.cpp" />
+    <ClCompile Include="ExpressionFunctionFeatureSource.cpp" />
+    <ClCompile Include="ExpressionFunctionHtmlColor.cpp" />
     <ClCompile Include="ExpressionFunctionIf.cpp" />
+    <ClCompile Include="ExpressionFunctionLayerDefinition.cpp" />
     <ClCompile Include="ExpressionFunctionLayerId.cpp" />
     <ClCompile Include="ExpressionFunctionLookup.cpp" />
+    <ClCompile Include="ExpressionFunctionMapCenterX.cpp" />
+    <ClCompile Include="ExpressionFunctionMapCenterY.cpp" />
     <ClCompile Include="ExpressionFunctionMapName.cpp" />
+    <ClCompile Include="ExpressionFunctionMapScale.cpp" />
     <ClCompile Include="ExpressionFunctionRange.cpp" />
     <ClCompile Include="ExpressionFunctionSession.cpp" />
     <ClCompile Include="ExpressionFunctionUrlEncode.cpp" />
@@ -297,10 +303,16 @@
     <ClInclude Include="ExpressionFunctionDecap.h" />
     <ClInclude Include="ExpressionFunctionFeatureClass.h" />
     <ClInclude Include="ExpressionFunctionFeatureId.h" />
+    <ClInclude Include="ExpressionFunctionFeatureSource.h" />
+    <ClInclude Include="ExpressionFunctionHtmlColor.h" />
     <ClInclude Include="ExpressionFunctionIf.h" />
+    <ClInclude Include="ExpressionFunctionLayerDefinition.h" />
     <ClInclude Include="ExpressionFunctionLayerId.h" />
     <ClInclude Include="ExpressionFunctionLookup.h" />
+    <ClInclude Include="ExpressionFunctionMapCenterX.h" />
+    <ClInclude Include="ExpressionFunctionMapCenterY.h" />
     <ClInclude Include="ExpressionFunctionMapName.h" />
+    <ClInclude Include="ExpressionFunctionMapScale.h" />
     <ClInclude Include="ExpressionFunctionRange.h" />
     <ClInclude Include="ExpressionFunctionSession.h" />
     <ClInclude Include="ExpressionFunctionUrlEncode.h" />

Modified: trunk/MgDev/Common/Stylization/Stylization.vcxproj.filters
===================================================================
--- trunk/MgDev/Common/Stylization/Stylization.vcxproj.filters	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Common/Stylization/Stylization.vcxproj.filters	2013-05-06 12:46:20 UTC (rev 7477)
@@ -265,6 +265,24 @@
       <Filter>Shared</Filter>
     </ClCompile>
     <ClCompile Include="ThemeParameters.cpp" />
+    <ClCompile Include="ExpressionFunctionHtmlColor.cpp">
+      <Filter>ExpressionEngine</Filter>
+    </ClCompile>
+    <ClCompile Include="ExpressionFunctionFeatureSource.cpp">
+      <Filter>ExpressionEngine</Filter>
+    </ClCompile>
+    <ClCompile Include="ExpressionFunctionLayerDefinition.cpp">
+      <Filter>ExpressionEngine</Filter>
+    </ClCompile>
+    <ClCompile Include="ExpressionFunctionMapCenterX.cpp">
+      <Filter>ExpressionEngine</Filter>
+    </ClCompile>
+    <ClCompile Include="ExpressionFunctionMapCenterY.cpp">
+      <Filter>ExpressionEngine</Filter>
+    </ClCompile>
+    <ClCompile Include="ExpressionFunctionMapScale.cpp">
+      <Filter>ExpressionEngine</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="ExpressionFunctionArgb.h">
@@ -572,6 +590,24 @@
     <ClInclude Include="StylizationAPI.h" />
     <ClInclude Include="StylizationDefs.h" />
     <ClInclude Include="ThemeParameters.h" />
+    <ClInclude Include="ExpressionFunctionHtmlColor.h">
+      <Filter>ExpressionEngine</Filter>
+    </ClInclude>
+    <ClInclude Include="ExpressionFunctionFeatureSource.h">
+      <Filter>ExpressionEngine</Filter>
+    </ClInclude>
+    <ClInclude Include="ExpressionFunctionLayerDefinition.h">
+      <Filter>ExpressionEngine</Filter>
+    </ClInclude>
+    <ClInclude Include="ExpressionFunctionMapCenterX.h">
+      <Filter>ExpressionEngine</Filter>
+    </ClInclude>
+    <ClInclude Include="ExpressionFunctionMapCenterY.h">
+      <Filter>ExpressionEngine</Filter>
+    </ClInclude>
+    <ClInclude Include="ExpressionFunctionMapScale.h">
+      <Filter>ExpressionEngine</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="Stylization.rc" />

Modified: trunk/MgDev/Desktop/MgDesktop/Services/MappingService.cpp
===================================================================
--- trunk/MgDev/Desktop/MgDesktop/Services/MappingService.cpp	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Desktop/MgDesktop/Services/MappingService.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -834,7 +834,7 @@
         if (userInfo != NULL)
             sessionId = userInfo->GetMgSessionId();*/
 
-        RS_MapUIInfo mapInfo(sessionId, map->GetName(), L"", srs, units, layoutColor);
+        RS_MapUIInfo mapInfo(sessionId, map->GetName(), L"", srs, units, layoutColor, center->GetX(), center->GetY(), dMapScale);
 
         // Dynamically adjust the width and height of the map
         printLayout->ComputeMapOffsetAndSize(dMapScale, extents, metersPerUnit, dr.mapOffsetX(), dr.mapOffsetY(), dr.mapWidth(), dr.mapHeight(), mapPlot->GetExpandToFit());

Modified: trunk/MgDev/Desktop/MgDesktop/Services/Rendering/MappingUtil.cpp
===================================================================
--- trunk/MgDev/Desktop/MgDesktop/Services/Rendering/MappingUtil.cpp	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Desktop/MgDesktop/Services/Rendering/MappingUtil.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -434,6 +434,7 @@
             //layer legend and ui specific information
             RS_UIGraphic uig(NULL, 0, mapLayer->GetLegendLabel());
             RS_LayerUIInfo layerInfo( mapLayer->GetName(),
+                                      layerid->ToString(),
                                       mapLayer->GetObjectId(),
                                       mapLayer->GetSelectable(),
                                       mapLayer->GetVisible(),
@@ -529,7 +530,7 @@
                     //string the viewer should be displaying as the name of each
                     //feature property
                     // TODO: check to see if name is FeatureClass or Extension name
-                    RS_FeatureClassInfo fcinfo(vl->GetFeatureName());
+                    RS_FeatureClassInfo fcinfo(vl->GetFeatureName(), vl->GetResourceID());
 
                     MdfModel::NameStringPairCollection* pmappings = vl->GetPropertyMappings();
                     for (int j=0; j<pmappings->GetCount(); j++)
@@ -641,7 +642,7 @@
                     //string the viewer should be displaying as the name of each
                     //feature property
                     // TODO: check to see if name is FeatureClass or Extension name
-                    RS_FeatureClassInfo fcinfo(gl->GetFeatureName());
+                    RS_FeatureClassInfo fcinfo(gl->GetFeatureName(), gl->GetResourceID());
 
                     //check for overridden feature query filter and remember it.
                     //we will use this when making feature queries

Modified: trunk/MgDev/Desktop/MgDesktop/Services/RenderingService.cpp
===================================================================
--- trunk/MgDev/Desktop/MgDesktop/Services/RenderingService.cpp	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Desktop/MgDesktop/Services/RenderingService.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -1293,9 +1293,6 @@
 
     // get the session ID
     STRING sessionId = map->GetSessionId();
-    //Ptr<MgUserInformation> userInfo = MgUserInformation::GetCurrentUserInfo();
-    //if (userInfo != NULL)
-    //    sessionId = userInfo->GetMgSessionId();
 
     // initialize the stylizer
     RSMgdSymbolManager mgr(m_svcResource);
@@ -1308,7 +1305,9 @@
 
     STRING format = options->GetImageFormat();
 
-    RS_MapUIInfo mapInfo(sessionId, map->GetName(), map->GetObjectId(), srs, units, bgcolor);
+    Ptr<MgPoint> ptCenter = map->GetViewCenter();
+    Ptr<MgCoordinate> coord = ptCenter->GetCoordinate();
+    RS_MapUIInfo mapInfo(sessionId, map->GetName(), map->GetObjectId(), srs, units, bgcolor, coord->GetX(), coord->GetY(), scale);
 
     // begin map stylization
     dr->StartMap(&mapInfo, b, scale, map->GetDisplayDpi(), map->GetMetersPerUnit(), NULL);
@@ -2084,7 +2083,7 @@
     // begin map stylization
     RS_Color bgcolor(0, 0, 0, 255); // not used
     STRING srs = map->GetMapSRS();
-    RS_MapUIInfo mapInfo(sessionId, map->GetName(), map->GetObjectId(), srs, L"", bgcolor);
+    RS_MapUIInfo mapInfo(sessionId, map->GetName(), map->GetObjectId(), srs, L"", bgcolor, center->GetX(), center->GetY(), scale);
 
     // initialize the stylizer
     SEMgdSymbolManager semgr(m_svcResource);
@@ -2241,7 +2240,9 @@
                     //for the first feature hit
 
                     RS_UIGraphic uig(NULL, 0, L"");
+                    Ptr<MgResourceIdentifier> layerDefId = layer->GetLayerDefinition();
                     RS_LayerUIInfo layerinfo(layer->GetName(),
+                                             layerDefId->ToString(),
                                              layer->GetObjectId(), // object ID
                                              true,   // selectable
                                              true,   // visible
@@ -2263,7 +2264,7 @@
                     //string the viewer should be displaying as the name of each
                     //feature property
                     // TODO: can FeatureName be an extension name rather than a FeatureClass?
-                    RS_FeatureClassInfo fcinfo(vl->GetFeatureName());
+                    RS_FeatureClassInfo fcinfo(vl->GetFeatureName(), vl->GetResourceID());
 
                     MdfModel::NameStringPairCollection* pmappings = vl->GetPropertyMappings();
                     for (int i=0; i<pmappings->GetCount(); i++)

Modified: trunk/MgDev/Desktop/UnitTest/TestRenderingService.cpp
===================================================================
--- trunk/MgDev/Desktop/UnitTest/TestRenderingService.cpp	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Desktop/UnitTest/TestRenderingService.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -315,12 +315,23 @@
         // publish the resource data
         Ptr<MgByteSource> dataSource6 = new MgByteSource(L"../UnitTestFiles/UT_RoadCenterLines.sdf", false);
         Ptr<MgByteReader> dataReader6 = dataSource6->GetReader();
-        m_svcResource->SetResourceData(fsres5, L"UT_RoadCenterLines.sdf", L"File", dataReader6);
+        m_svcResource->SetResourceData(fsres6, L"UT_RoadCenterLines.sdf", L"File", dataReader6);
 
         Ptr<MgByteSource> dataSource7 = new MgByteSource(L"../UnitTestFiles/UT_VotingDistricts.sdf", false);
         Ptr<MgByteReader> dataReader7 = dataSource7->GetReader();
-        m_svcResource->SetResourceData(fsres6, L"UT_VotingDistricts.sdf", L"File", dataReader7);
+        m_svcResource->SetResourceData(fsres7, L"UT_VotingDistricts.sdf", L"File", dataReader7);
 
+        // Data related to stylization function tests
+        Ptr<MgResourceIdentifier> ldfres14 = new MgResourceIdentifier(L"Library://UnitTests/Layers/StylizationFuncs.LayerDefinition");
+        Ptr<MgByteSource> ldfsrc14 = new MgByteSource(L"../UnitTestFiles/UT_VotingDistrictsFunctions.ldf", false);
+        Ptr<MgByteReader> ldfrdr14 = ldfsrc14->GetReader();
+        m_svcResource->SetResource(ldfres14, ldfrdr14, NULL);
+
+        Ptr<MgResourceIdentifier> mapres15 = new MgResourceIdentifier(L"Library://UnitTests/Maps/StylizationFuncs.MapDefinition");
+        Ptr<MgByteSource> mdfsrc15 = new MgByteSource(L"../UnitTestFiles/UT_StylizationFuncs.mdf", false);
+        Ptr<MgByteReader> mdfrdr15 = mdfsrc15->GetReader();
+        m_svcResource->SetResource(mapres15, mdfrdr15, NULL);
+
     }
     catch (MgException* e)
     {
@@ -440,6 +451,13 @@
         m_svcResource->DeleteResource(fsres6);
         Ptr<MgResourceIdentifier> fsres7 = new MgResourceIdentifier(L"Library://UnitTests/Data/VotingDistricts.FeatureSource");
         m_svcResource->DeleteResource(fsres7);
+
+        // Data related to stylization function tests
+        Ptr<MgResourceIdentifier> ldfres14 = new MgResourceIdentifier(L"Library://UnitTests/Layers/StylizationFuncs.LayerDefinition");
+        m_svcResource->GetResourceHeader(ldfres14);
+
+        Ptr<MgResourceIdentifier> mapres15 = new MgResourceIdentifier(L"Library://UnitTests/Maps/StylizationFuncs.MapDefinition");
+        m_svcResource->GetResourceHeader(mapres15);
     }
     catch(MgFileIoException* e)
     {
@@ -669,6 +687,42 @@
     }
 }
 
+void TestRenderingService::TestCase_StylizationFunctions(CREFSTRING imageFormat, CREFSTRING extension)
+{
+    try
+    {
+        Ptr<MgdMap> map = CreateTestStylizationFunctionMap();
+        
+        // call the API using a scale of 75000
+        map->SetViewScale(75000.0);
+
+        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderDynamicOverlay(map, NULL, imageFormat);
+        rdr1->ToFile(GetPath(L"../UnitTestFiles/StylizationFunc_75k", imageFormat, extension));
+
+        // call the API using a scale of 12000
+        map->SetViewScale(12000);
+        Ptr<MgByteReader> rdr2 = m_svcRendering->RenderDynamicOverlay(map, NULL, imageFormat);
+        rdr2->ToFile(GetPath(L"../UnitTestFiles/StylizationFunc_12k", imageFormat, extension));
+
+        // Move around
+        Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733753, 43.746899);
+        Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
+        map->SetViewCenter(ptNewCenter);
+        Ptr<MgByteReader> rdr3 = m_svcRendering->RenderDynamicOverlay(map, NULL, imageFormat);
+        rdr3->ToFile(GetPath(L"../UnitTestFiles/StylizationFunc_12k_Moved", 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
@@ -740,6 +794,23 @@
     return map;
 }
 
+MgdMap* TestRenderingService::CreateTestStylizationFunctionMap()
+{
+    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/StylizationFuncs.MapDefinition");
+    MgdMap* map = new MgdMap(mdfres);
+    //map->Create(mdfres, L"StylizationFuncs");
+
+    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733253, 43.746199);
+    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
+    map->SetViewCenter(ptNewCenter);
+    map->SetViewScale(60000.0);
+    map->SetDisplayDpi(96);
+    map->SetDisplayWidth(1024);
+    map->SetDisplayHeight(1024);
+
+    return map;
+}
+
 MgdMap* TestRenderingService::CreateTestTiledMap()
 {
     Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/BaseMap.MapDefinition");

Modified: trunk/MgDev/Desktop/UnitTest/TestRenderingService.h
===================================================================
--- trunk/MgDev/Desktop/UnitTest/TestRenderingService.h	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Desktop/UnitTest/TestRenderingService.h	2013-05-06 12:46:20 UTC (rev 7477)
@@ -25,6 +25,8 @@
     CPPUNIT_TEST_SUITE(TestRenderingService);
     CPPUNIT_TEST(TestStart); // This must be the very first unit test
 
+    CPPUNIT_TEST(TestCase_StylizationFunctionsPNG);
+
     CPPUNIT_TEST(TestCase_SymbologyPointsPNG);
     CPPUNIT_TEST(TestCase_SymbologyPointsParamPNG);
     CPPUNIT_TEST(TestCase_SymbologyLinesPNG);
@@ -41,6 +43,8 @@
     CPPUNIT_TEST(TestCase_RenderMapWithWatermarkPNG);
     CPPUNIT_TEST(TestCase_RenderLegendPNG);
 
+    CPPUNIT_TEST(TestCase_StylizationFunctionsPNG8);
+
 	CPPUNIT_TEST(TestCase_SymbologyPointsPNG8);
     CPPUNIT_TEST(TestCase_SymbologyPointsParamPNG8);
     CPPUNIT_TEST(TestCase_SymbologyLinesPNG8);
@@ -57,6 +61,8 @@
     CPPUNIT_TEST(TestCase_RenderMapWithWatermarkPNG8);
     CPPUNIT_TEST(TestCase_RenderLegendPNG8);
 
+    CPPUNIT_TEST(TestCase_StylizationFunctionsGIF);
+
 	CPPUNIT_TEST(TestCase_SymbologyPointsGIF);
     CPPUNIT_TEST(TestCase_SymbologyPointsParamGIF);
     CPPUNIT_TEST(TestCase_SymbologyLinesGIF);
@@ -73,6 +79,8 @@
     CPPUNIT_TEST(TestCase_RenderMapWithWatermarkGIF);
     CPPUNIT_TEST(TestCase_RenderLegendGIF);
 
+    CPPUNIT_TEST(TestCase_StylizationFunctionsJPG);
+
 	CPPUNIT_TEST(TestCase_SymbologyPointsJPG);
     CPPUNIT_TEST(TestCase_SymbologyPointsParamJPG);
     CPPUNIT_TEST(TestCase_SymbologyLinesJPG);
@@ -122,6 +130,8 @@
     void TestCase_Annotation2(CREFSTRING imageFormat, CREFSTRING extension);
     void TestCase_Annotation3(CREFSTRING imageFormat, CREFSTRING extension);
 
+    void TestCase_StylizationFunctions(CREFSTRING imageFormat, CREFSTRING extension);
+
 	//PNG output tests
 	void TestCase_RenderDynamicOverlayPNG() { TestCase_RenderDynamicOverlay(L"PNG", L"png"); }
     void TestCase_RenderDynamicOverlayTiledMapPNG() { TestCase_RenderDynamicOverlayTiledMap(L"PNG", L"png"); }
@@ -136,6 +146,7 @@
     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_StylizationFunctionsPNG() { TestCase_StylizationFunctions(L"PNG", L"png"); }
 
 	//PNG8 output tests
 	void TestCase_RenderDynamicOverlayPNG8() { TestCase_RenderDynamicOverlay(L"PNG8", L"png"); }
@@ -151,6 +162,7 @@
     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_StylizationFunctionsPNG8() { TestCase_StylizationFunctions(L"PNG8", L"png"); }
 
 	//GIF output tests
 	void TestCase_RenderDynamicOverlayGIF() { TestCase_RenderDynamicOverlay(L"GIF", L"gif"); }
@@ -166,6 +178,7 @@
     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_StylizationFunctionsGIF() { TestCase_StylizationFunctions(L"GIF", L"gif"); }
 
 	//JPG output tests
 	void TestCase_RenderDynamicOverlayJPG() { TestCase_RenderDynamicOverlay(L"JPG", L"jpg"); }
@@ -181,6 +194,7 @@
     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_StylizationFunctionsJPG() { TestCase_StylizationFunctions(L"JPG", L"jpg"); }
 
     void TestCase_QueryFeatures();
 
@@ -189,6 +203,7 @@
 private:
     MgdMap* CreateTestMap();
     MgdMap* CreateTestTiledMap();
+    MgdMap* CreateTestStylizationFunctionMap();
     MgdMap* CreateTestMapWithWatermark();
     MgPolygon* CreateSelectionPolygon(MgdMap* map, double width, double height);
     static STRING GetPath(CREFSTRING basePath, CREFSTRING imageFormat, CREFSTRING extension);

Modified: trunk/MgDev/Server/src/Core/Makefile.am
===================================================================
--- trunk/MgDev/Server/src/Core/Makefile.am	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Server/src/Core/Makefile.am	2013-05-06 12:46:20 UTC (rev 7477)
@@ -260,6 +260,7 @@
 	@cp -f ../../../UnitTest/TestData/Symbology/UT_Annotation3.ldf ../UnitTestFiles
 	@cp -f ../../../UnitTest/TestData/Symbology/UT_Annotation3.mdf ../UnitTestFiles
 	@cp -f ../../../UnitTest/TestData/TileService/UT_BaseMap.mdf ../UnitTestFiles
+	@cp -f ../../../UnitTest/TestData/TileService/UT_StylizationFuncs.mdf ../UnitTestFiles
 	@cp -f ../../../UnitTest/TestData/TileService/UT_Parcels.fs ../UnitTestFiles
 	@cp -f ../../../UnitTest/TestData/TileService/UT_Parcels.ldf ../UnitTestFiles
 	@cp -f ../../../UnitTest/TestData/TileService/UT_Parcels.sdf ../UnitTestFiles
@@ -268,6 +269,7 @@
 	@cp -f ../../../UnitTest/TestData/TileService/UT_RoadCenterLines.sdf ../UnitTestFiles
 	@cp -f ../../../UnitTest/TestData/TileService/UT_VotingDistricts.fs ../UnitTestFiles
 	@cp -f ../../../UnitTest/TestData/TileService/UT_VotingDistricts.ldf ../UnitTestFiles
+	@cp -f ../../../UnitTest/TestData/TileService/UT_VotingDistrictsFunctions.ldf ../UnitTestFiles
 	@cp -f ../../../UnitTest/TestData/TileService/UT_VotingDistricts.sdf ../UnitTestFiles
 	@cp -f ../../../UnitTest/TestData/ServerAdmin/1.1.1.mgd ../UnitTestFiles
 	@cp -f ../../../UnitTest/TestData/CoordinateSystems/epsgcodes.txt ../UnitTestFiles

Modified: trunk/MgDev/Server/src/PostBuild/PostBuild.mak
===================================================================
--- trunk/MgDev/Server/src/PostBuild/PostBuild.mak	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Server/src/PostBuild/PostBuild.mak	2013-05-06 12:46:20 UTC (rev 7477)
@@ -164,6 +164,7 @@
         ..\..\bin\UnitTestFiles\TEST.FeatureSource \
         ..\..\bin\UnitTestFiles\TEST.sdf \
         ..\..\bin\UnitTestFiles\UT_BaseMap.mdf \
+        ..\..\bin\UnitTestFiles\UT_StylizationFuncs.mdf \
         ..\..\bin\UnitTestFiles\UT_Parcels.fs \
         ..\..\bin\UnitTestFiles\UT_Parcels.ldf \
         ..\..\bin\UnitTestFiles\UT_Parcels.sdf \
@@ -172,6 +173,7 @@
         ..\..\bin\UnitTestFiles\UT_RoadCenterLines.sdf \
         ..\..\bin\UnitTestFiles\UT_VotingDistricts.fs \
         ..\..\bin\UnitTestFiles\UT_VotingDistricts.ldf \
+        ..\..\bin\UnitTestFiles\UT_VotingDistrictsFunctions.ldf \
         ..\..\bin\UnitTestFiles\UT_VotingDistricts.sdf \
         ..\..\bin\UnitTestFiles\UT_AllElements.pl \
         ..\..\bin\UnitTestFiles\UT_NoLegend.pl \
@@ -421,6 +423,7 @@
         ..\..\bin\UnitTestFiles\TEST.FeatureSource \
         ..\..\bin\UnitTestFiles\TEST.sdf \
         ..\..\bin\UnitTestFiles\UT_BaseMap.mdf \
+        ..\..\bin\UnitTestFiles\UT_StylizationFuncs.mdf \
         ..\..\bin\UnitTestFiles\UT_Parcels.fs \
         ..\..\bin\UnitTestFiles\UT_Parcels.ldf \
         ..\..\bin\UnitTestFiles\UT_Parcels.sdf \
@@ -429,6 +432,7 @@
         ..\..\bin\UnitTestFiles\UT_RoadCenterLines.sdf \
         ..\..\bin\UnitTestFiles\UT_VotingDistricts.fs \
         ..\..\bin\UnitTestFiles\UT_VotingDistricts.ldf \
+        ..\..\bin\UnitTestFiles\UT_VotingDistrictsFunctions.ldf \
         ..\..\bin\UnitTestFiles\UT_VotingDistricts.sdf \
         ..\..\bin\UnitTestFiles\UT_AllElements.pl \
         ..\..\bin\UnitTestFiles\UT_NoLegend.pl \
@@ -678,6 +682,7 @@
           ..\..\bin\UnitTestFiles\TEST.FeatureSource \
           ..\..\bin\UnitTestFiles\TEST.sdf \
           ..\..\bin\UnitTestFiles\UT_BaseMap.mdf \
+          ..\..\bin\UnitTestFiles\UT_StylizationFuncs.mdf \
           ..\..\bin\UnitTestFiles\UT_Parcels.fs \
           ..\..\bin\UnitTestFiles\UT_Parcels.ldf \
           ..\..\bin\UnitTestFiles\UT_Parcels.sdf \
@@ -686,6 +691,7 @@
           ..\..\bin\UnitTestFiles\UT_RoadCenterLines.sdf \
           ..\..\bin\UnitTestFiles\UT_VotingDistricts.fs \
           ..\..\bin\UnitTestFiles\UT_VotingDistricts.ldf \
+          ..\..\bin\UnitTestFiles\UT_VotingDistrictsFunctions.ldf \
           ..\..\bin\UnitTestFiles\UT_VotingDistricts.sdf \
           ..\..\bin\UnitTestFiles\UT_AllElements.pl \
           ..\..\bin\UnitTestFiles\UT_NoLegend.pl \
@@ -935,6 +941,7 @@
           ..\..\bin\UnitTestFiles\TEST.FeatureSource \
           ..\..\bin\UnitTestFiles\TEST.sdf \
           ..\..\bin\UnitTestFiles\UT_BaseMap.mdf \
+          ..\..\bin\UnitTestFiles\UT_StylizationFuncs.mdf \
           ..\..\bin\UnitTestFiles\UT_Parcels.fs \
           ..\..\bin\UnitTestFiles\UT_Parcels.ldf \
           ..\..\bin\UnitTestFiles\UT_Parcels.sdf \
@@ -943,6 +950,7 @@
           ..\..\bin\UnitTestFiles\UT_RoadCenterLines.sdf \
           ..\..\bin\UnitTestFiles\UT_VotingDistricts.fs \
           ..\..\bin\UnitTestFiles\UT_VotingDistricts.ldf \
+          ..\..\bin\UnitTestFiles\UT_VotingDistrictsFunctions.ldf \
           ..\..\bin\UnitTestFiles\UT_VotingDistricts.sdf \
           ..\..\bin\UnitTestFiles\UT_AllElements.pl \
           ..\..\bin\UnitTestFiles\UT_NoLegend.pl \
@@ -1065,6 +1073,7 @@
     if EXIST ..\..\bin\UnitTestFiles\TEST.FeatureSource             del /F ..\..\bin\UnitTestFiles\TEST.FeatureSource
     if EXIST ..\..\bin\UnitTestFiles\TEST.sdf                       del /F ..\..\bin\UnitTestFiles\TEST.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_BaseMap.mdf                 del /F ..\..\bin\UnitTestFiles\UT_BaseMap.mdf
+    if EXIST ..\..\bin\UnitTestFiles\UT_StylizationFuncs.mdf        del /F ..\..\bin\UnitTestFiles\UT_StylizationFuncs.mdf
     if EXIST ..\..\bin\UnitTestFiles\UT_Parcels.fs                  del /F ..\..\bin\UnitTestFiles\UT_Parcels.fs
     if EXIST ..\..\bin\UnitTestFiles\UT_Parcels.ldf                 del /F ..\..\bin\UnitTestFiles\UT_Parcels.ldf
     if EXIST ..\..\bin\UnitTestFiles\UT_Parcels.sdf                 del /F ..\..\bin\UnitTestFiles\UT_Parcels.sdf
@@ -1073,6 +1082,7 @@
     if EXIST ..\..\bin\UnitTestFiles\UT_RoadCenterLines.sdf         del /F ..\..\bin\UnitTestFiles\UT_RoadCenterLines.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistricts.fs          del /F ..\..\bin\UnitTestFiles\UT_VotingDistricts.fs
     if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistricts.ldf         del /F ..\..\bin\UnitTestFiles\UT_VotingDistricts.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistrictsFunctions.ldf del /F ..\..\bin\UnitTestFiles\UT_VotingDistrictsFunctions.ldf
     if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistricts.sdf         del /F ..\..\bin\UnitTestFiles\UT_VotingDistricts.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_AllElements.pl              del /F ..\..\bin\UnitTestFiles\UT_AllElements.pl
     if EXIST ..\..\bin\UnitTestFiles\UT_NoLegend.pl                 del /F ..\..\bin\UnitTestFiles\UT_NoLegend.pl
@@ -1190,6 +1200,7 @@
     if EXIST ..\..\bin\UnitTestFiles\TEST.FeatureSource             del /F ..\..\bin\UnitTestFiles\TEST.FeatureSource
     if EXIST ..\..\bin\UnitTestFiles\TEST.sdf                       del /F ..\..\bin\UnitTestFiles\TEST.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_BaseMap.mdf                 del /F ..\..\bin\UnitTestFiles\UT_BaseMap.mdf
+    if EXIST ..\..\bin\UnitTestFiles\UT_StylizationFuncs.mdf        del /F ..\..\bin\UnitTestFiles\UT_StylizationFuncs.mdf
     if EXIST ..\..\bin\UnitTestFiles\UT_Parcels.fs                  del /F ..\..\bin\UnitTestFiles\UT_Parcels.fs
     if EXIST ..\..\bin\UnitTestFiles\UT_Parcels.ldf                 del /F ..\..\bin\UnitTestFiles\UT_Parcels.ldf
     if EXIST ..\..\bin\UnitTestFiles\UT_Parcels.sdf                 del /F ..\..\bin\UnitTestFiles\UT_Parcels.sdf
@@ -1198,6 +1209,7 @@
     if EXIST ..\..\bin\UnitTestFiles\UT_RoadCenterLines.sdf         del /F ..\..\bin\UnitTestFiles\UT_RoadCenterLines.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistricts.fs          del /F ..\..\bin\UnitTestFiles\UT_VotingDistricts.fs
     if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistricts.ldf         del /F ..\..\bin\UnitTestFiles\UT_VotingDistricts.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistrictsFunctions.ldf del /F ..\..\bin\UnitTestFiles\UT_VotingDistrictsFunctions.ldf
     if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistricts.sdf         del /F ..\..\bin\UnitTestFiles\UT_VotingDistricts.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_AllElements.pl              del /F ..\..\bin\UnitTestFiles\UT_AllElements.pl
     if EXIST ..\..\bin\UnitTestFiles\UT_NoLegend.pl                 del /F ..\..\bin\UnitTestFiles\UT_NoLegend.pl
@@ -1315,6 +1327,7 @@
     if EXIST ..\..\bin\UnitTestFiles\TEST.FeatureSource             del /F ..\..\bin\UnitTestFiles\TEST.FeatureSource
     if EXIST ..\..\bin\UnitTestFiles\TEST.sdf                       del /F ..\..\bin\UnitTestFiles\TEST.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_BaseMap.mdf                 del /F ..\..\bin\UnitTestFiles\UT_BaseMap.mdf
+    if EXIST ..\..\bin\UnitTestFiles\UT_StylizationFuncs.mdf        del /F ..\..\bin\UnitTestFiles\UT_StylizationFuncs.mdf
     if EXIST ..\..\bin\UnitTestFiles\UT_Parcels.fs                  del /F ..\..\bin\UnitTestFiles\UT_Parcels.fs
     if EXIST ..\..\bin\UnitTestFiles\UT_Parcels.ldf                 del /F ..\..\bin\UnitTestFiles\UT_Parcels.ldf
     if EXIST ..\..\bin\UnitTestFiles\UT_Parcels.sdf                 del /F ..\..\bin\UnitTestFiles\UT_Parcels.sdf
@@ -1323,6 +1336,7 @@
     if EXIST ..\..\bin\UnitTestFiles\UT_RoadCenterLines.sdf         del /F ..\..\bin\UnitTestFiles\UT_RoadCenterLines.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistricts.fs          del /F ..\..\bin\UnitTestFiles\UT_VotingDistricts.fs
     if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistricts.ldf         del /F ..\..\bin\UnitTestFiles\UT_VotingDistricts.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistrictsFunctions.ldf del /F ..\..\bin\UnitTestFiles\UT_VotingDistrictsFunctions.ldf
     if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistricts.sdf         del /F ..\..\bin\UnitTestFiles\UT_VotingDistricts.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_AllElements.pl              del /F ..\..\bin\UnitTestFiles\UT_AllElements.pl
     if EXIST ..\..\bin\UnitTestFiles\UT_NoLegend.pl                 del /F ..\..\bin\UnitTestFiles\UT_NoLegend.pl
@@ -1394,8 +1408,8 @@
     if EXIST ..\..\bin\UnitTestFiles\UT_Annotation3.mdf             del /F ..\..\bin\UnitTestFiles\UT_Annotation3.mdf
     if EXIST ..\..\bin\UnitTestFiles\SavePointTest.sqlite           del /F ..\..\bin\UnitTestFiles\SavePointTest.sqlite
     if EXIST ..\..\bin\UnitTestFiles\SavePointTest.FeatureSource    del /F ..\..\bin\UnitTestFiles\SavePointTest.FeatureSource
-	if EXIST ..\..\bin\UnitTestFiles\UT_Parcels_SQLite_Join.FeatureSource    del /F ..\..\bin\UnitTestFiles\UT_Parcels_SQLite_Join.FeatureSource
-    if EXIST ..\..\bin\UnitTestFiles\UT_FdoJoin.FeatureSource		del /F ..\..\bin\UnitTestFiles\UT_FdoJoin.FeatureSource
+    if EXIST ..\..\bin\UnitTestFiles\UT_Parcels_SQLite_Join.FeatureSource    del /F ..\..\bin\UnitTestFiles\UT_Parcels_SQLite_Join.FeatureSource
+    if EXIST ..\..\bin\UnitTestFiles\UT_FdoJoin.FeatureSource       del /F ..\..\bin\UnitTestFiles\UT_FdoJoin.FeatureSource
     if EXIST ..\..\bin\UnitTestFiles\ParcelsJoinTest.sqlite         del /F ..\..\bin\UnitTestFiles\ParcelsJoinTest.sqlite
     if EXIST ..\..\bin\UnitTestFiles\JoinTest.sqlite                del /F ..\..\bin\UnitTestFiles\JoinTest.FeatureSource
 
@@ -1438,6 +1452,7 @@
     if EXIST ..\..\bin\UnitTestFiles\TEST.FeatureSource             del /F ..\..\bin\UnitTestFiles\TEST.FeatureSource
     if EXIST ..\..\bin\UnitTestFiles\TEST.sdf                       del /F ..\..\bin\UnitTestFiles\TEST.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_BaseMap.mdf                 del /F ..\..\bin\UnitTestFiles\UT_BaseMap.mdf
+    if EXIST ..\..\bin\UnitTestFiles\UT_StylizationFuncs.mdf        del /F ..\..\bin\UnitTestFiles\UT_StylizationFuncs.mdf
     if EXIST ..\..\bin\UnitTestFiles\UT_Parcels.fs                  del /F ..\..\bin\UnitTestFiles\UT_Parcels.fs
     if EXIST ..\..\bin\UnitTestFiles\UT_Parcels.ldf                 del /F ..\..\bin\UnitTestFiles\UT_Parcels.ldf
     if EXIST ..\..\bin\UnitTestFiles\UT_Parcels.sdf                 del /F ..\..\bin\UnitTestFiles\UT_Parcels.sdf
@@ -1446,6 +1461,7 @@
     if EXIST ..\..\bin\UnitTestFiles\UT_RoadCenterLines.sdf         del /F ..\..\bin\UnitTestFiles\UT_RoadCenterLines.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistricts.fs          del /F ..\..\bin\UnitTestFiles\UT_VotingDistricts.fs
     if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistricts.ldf         del /F ..\..\bin\UnitTestFiles\UT_VotingDistricts.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistrictsFunctions.ldf del /F ..\..\bin\UnitTestFiles\UT_VotingDistrictsFunctions.ldf
     if EXIST ..\..\bin\UnitTestFiles\UT_VotingDistricts.sdf         del /F ..\..\bin\UnitTestFiles\UT_VotingDistricts.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_AllElements.pl              del /F ..\..\bin\UnitTestFiles\UT_AllElements.pl
     if EXIST ..\..\bin\UnitTestFiles\UT_NoLegend.pl                 del /F ..\..\bin\UnitTestFiles\UT_NoLegend.pl
@@ -1558,6 +1574,7 @@
 "..\..\..\UnitTest\TestData\MappingService\UT_Rail.fs" :
 "..\..\..\UnitTest\TestData\MappingService\UT_Rail.ldf" :
 "..\..\..\UnitTest\TestData\TileService\UT_BaseMap.mdf" :
+"..\..\..\UnitTest\TestData\TileService\UT_StylizationFuncs.mdf" :
 "..\..\..\UnitTest\TestData\TileService\UT_Parcels.fs" :
 "..\..\..\UnitTest\TestData\TileService\UT_Parcels.ldf" :
 "..\..\..\UnitTest\TestData\TileService\UT_Parcels.sdf" :
@@ -1566,6 +1583,7 @@
 "..\..\..\UnitTest\TestData\TileService\UT_RoadCenterLines.sdf" :
 "..\..\..\UnitTest\TestData\TileService\UT_VotingDistricts.fs" :
 "..\..\..\UnitTest\TestData\TileService\UT_VotingDistricts.ldf" :
+"..\..\..\UnitTest\TestData\TileService\UT_VotingDistrictsFunctions.ldf" :
 "..\..\..\UnitTest\TestData\TileService\UT_VotingDistricts.sdf" :
 "..\..\..\UnitTest\TestData\ServerAdmin\1.1.1.mgd" :
 "..\..\..\UnitTest\TestData\CoordinateSystems\epsgcodes.txt" :
@@ -1755,6 +1773,10 @@
     if NOT EXIST ..\..\bin\UnitTestFiles\nul mkdir ..\..\bin\UnitTestFiles
     if EXIST "..\..\..\UnitTest\TestData\TileService\UT_BaseMap.mdf" xcopy /r /d /y "..\..\..\UnitTest\TestData\TileService\UT_BaseMap.mdf" ..\..\bin\UnitTestFiles\
 
+..\..\bin\UnitTestFiles\UT_StylizationFuncs.mdf : "..\..\..\UnitTest\TestData\TileService\UT_StylizationFuncs.mdf"
+    if NOT EXIST ..\..\bin\UnitTestFiles\nul mkdir ..\..\bin\UnitTestFiles
+    if EXIST "..\..\..\UnitTest\TestData\TileService\UT_StylizationFuncs.mdf" xcopy /r /d /y "..\..\..\UnitTest\TestData\TileService\UT_StylizationFuncs.mdf" ..\..\bin\UnitTestFiles\
+
 ..\..\bin\UnitTestFiles\UT_Parcels.fs : "..\..\..\UnitTest\TestData\TileService\UT_Parcels.fs"
     if NOT EXIST ..\..\bin\UnitTestFiles\nul mkdir ..\..\bin\UnitTestFiles
     if EXIST "..\..\..\UnitTest\TestData\TileService\UT_Parcels.fs" xcopy /r /d /y "..\..\..\UnitTest\TestData\TileService\UT_Parcels.fs" ..\..\bin\UnitTestFiles\
@@ -1787,6 +1809,10 @@
     if NOT EXIST ..\..\bin\UnitTestFiles\nul mkdir ..\..\bin\UnitTestFiles
     if EXIST "..\..\..\UnitTest\TestData\TileService\UT_VotingDistricts.ldf" xcopy /r /d /y "..\..\..\UnitTest\TestData\TileService\UT_VotingDistricts.ldf" ..\..\bin\UnitTestFiles\
 
+..\..\bin\UnitTestFiles\UT_VotingDistrictsFunctions.ldf : "..\..\..\UnitTest\TestData\TileService\UT_VotingDistrictsFunctions.ldf"
+    if NOT EXIST ..\..\bin\UnitTestFiles\nul mkdir ..\..\bin\UnitTestFiles
+    if EXIST "..\..\..\UnitTest\TestData\TileService\UT_VotingDistrictsFunctions.ldf" xcopy /r /d /y "..\..\..\UnitTest\TestData\TileService\UT_VotingDistrictsFunctions.ldf" ..\..\bin\UnitTestFiles\
+
 ..\..\bin\UnitTestFiles\UT_VotingDistricts.sdf : "..\..\..\UnitTest\TestData\TileService\UT_VotingDistricts.sdf"
     if NOT EXIST ..\..\bin\UnitTestFiles\nul mkdir ..\..\bin\UnitTestFiles
     if EXIST "..\..\..\UnitTest\TestData\TileService\UT_VotingDistricts.sdf" xcopy /r /d /y "..\..\..\UnitTest\TestData\TileService\UT_VotingDistricts.sdf" ..\..\bin\UnitTestFiles\

Modified: trunk/MgDev/Server/src/Services/Kml/ServerKmlService.cpp
===================================================================
--- trunk/MgDev/Server/src/Services/Kml/ServerKmlService.cpp	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Server/src/Services/Kml/ServerKmlService.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -451,8 +451,10 @@
         wcstombs(legendImage, strLegendImage.c_str(), 4096 );
     }
     
+    Ptr<MgResourceIdentifier> layerDefId = layer->GetLayerDefinition();
     RS_UIGraphic uig((unsigned char*)legendImage, 0, layer->GetLegendLabel());
     RS_LayerUIInfo layerInfo(layer->GetName(),
+                             layerDefId->ToString(),
                              layer->GetObjectId(),
                              layer->GetSelectable(),
                              layer->GetVisible(),
@@ -487,7 +489,7 @@
 
         if (NULL != fdoReader.p)
         {
-            RS_FeatureClassInfo fcInfo(vl->GetFeatureName());
+            RS_FeatureClassInfo fcInfo(vl->GetFeatureName(), vl->GetResourceID());
             MdfModel::NameStringPairCollection* pmappings = vl->GetPropertyMappings();
             for (int j=0; j<pmappings->GetCount(); j++)
             {

Modified: trunk/MgDev/Server/src/Services/Mapping/MappingUtil.cpp
===================================================================
--- trunk/MgDev/Server/src/Services/Mapping/MappingUtil.cpp	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Server/src/Services/Mapping/MappingUtil.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -451,6 +451,7 @@
             //layer legend and ui specific information
             RS_UIGraphic uig(NULL, 0, mapLayer->GetLegendLabel());
             RS_LayerUIInfo layerInfo( mapLayer->GetName(),
+                                      layerid->ToString(),
                                       mapLayer->GetObjectId(),
                                       mapLayer->GetSelectable(),
                                       mapLayer->GetVisible(),
@@ -546,7 +547,7 @@
                     //string the viewer should be displaying as the name of each
                     //feature property
                     // TODO: check to see if name is FeatureClass or Extension name
-                    RS_FeatureClassInfo fcinfo(vl->GetFeatureName());
+                    RS_FeatureClassInfo fcinfo(vl->GetFeatureName(), vl->GetResourceID());
 
                     MdfModel::NameStringPairCollection* pmappings = vl->GetPropertyMappings();
                     for (int j=0; j<pmappings->GetCount(); j++)
@@ -658,7 +659,7 @@
                     //string the viewer should be displaying as the name of each
                     //feature property
                     // TODO: check to see if name is FeatureClass or Extension name
-                    RS_FeatureClassInfo fcinfo(gl->GetFeatureName());
+                    RS_FeatureClassInfo fcinfo(gl->GetFeatureName(), gl->GetResourceID());
 
                     //check for overridden feature query filter and remember it.
                     //we will use this when making feature queries

Modified: trunk/MgDev/Server/src/Services/Mapping/ServerMappingService.cpp
===================================================================
--- trunk/MgDev/Server/src/Services/Mapping/ServerMappingService.cpp	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Server/src/Services/Mapping/ServerMappingService.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -223,10 +223,12 @@
     StylizationUtil::ParseColor( mdf->GetBackgroundColor(), bgcolor);
 
     //These should not matter for GenerateMap
+    Ptr<MgPoint> ptCenter = map->GetViewCenter();
+    Ptr<MgCoordinate> coord = ptCenter->GetCoordinate();
     double dMapScale = map->GetViewScale();
     double dpi = map->GetDisplayDpi();
 
-    RS_MapUIInfo mapInfo(sessionId, mapResId->GetName(), map->GetObjectId(), srs, units, bgcolor);
+    RS_MapUIInfo mapInfo(sessionId, mapResId->GetName(), map->GetObjectId(), srs, units, bgcolor, coord->GetX(), coord->GetY(), dMapScale);
 
     dr.StartMap(&mapInfo, b, dMapScale, dpi, metersPerUnit);
 
@@ -244,6 +246,7 @@
         //layer legend and ui specific information
         RS_UIGraphic uig(NULL, 0, mggroup->GetLegendLabel());
         RS_LayerUIInfo layerInfo( mggroup->GetName(),
+                                  L"",
                                   mggroup->GetObjectId(),
                                   false,   // selectable - does not apply to groups
                                   mggroup->GetVisible(),
@@ -277,8 +280,10 @@
             bEditable = false;
 
         //layer legend and ui specific information
+        Ptr<MgResourceIdentifier> layerDefId = mglayer->GetLayerDefinition();
         RS_UIGraphic uig(NULL, 0, mglayer->GetLegendLabel());
         RS_LayerUIInfo layerInfo( mglayer->GetName(),
+                                  layerDefId->ToString(),
                                   mglayer->GetObjectId(),
                                   mglayer->GetSelectable(),
                                   mglayer->GetVisible(),
@@ -475,6 +480,8 @@
     RS_Color bgcolor;
     StylizationUtil::ParseColor( map->GetBackgroundColor(), bgcolor);
 
+    Ptr<MgPoint> ptCenter = map->GetViewCenter();
+    Ptr<MgCoordinate> coord = ptCenter->GetCoordinate();
     double dMapScale = map->GetViewScale();
     double dpi       = map->GetDisplayDpi();
 
@@ -499,7 +506,7 @@
     SEMgSymbolManager semgr(m_svcResource);
     DefaultStylizer ds(&semgr);
 
-    RS_MapUIInfo mapInfo(sessionId, map->GetName(), map->GetObjectId(), srs, units, bgcolor);
+    RS_MapUIInfo mapInfo(sessionId, map->GetName(), map->GetObjectId(), srs, units, bgcolor, coord->GetX(), coord->GetY(), dMapScale);
 
     //begin map stylization
     dr.StartMap(&mapInfo, b, dMapScale, dpi, metersPerUnit, xformToLL);
@@ -517,6 +524,7 @@
             //layer legend and ui specific information
             RS_UIGraphic uig(NULL, 0, mggroup->GetLegendLabel());
             RS_LayerUIInfo layerInfo( mggroup->GetName(),
+                                      L"",
                                       mggroup->GetObjectId(),
                                       false,   // selectable - does not apply to groups
                                       mggroup->GetVisible(),
@@ -547,9 +555,11 @@
             if (mglayer->GetLayerType() == MgLayerType::BaseMap)
                 bEditable = false;
 
+            Ptr<MgResourceIdentifier> layerDefId = mglayer->GetLayerDefinition();
             //layer legend and ui specific information
             RS_UIGraphic uig(NULL, 0, mglayer->GetLegendLabel());
             RS_LayerUIInfo layerInfo( mglayer->GetName(),
+                                      layerDefId->ToString(),
                                       mglayer->GetObjectId(),
                                       mglayer->GetSelectable(),
                                       mglayer->GetVisible(),
@@ -1222,7 +1232,7 @@
         if (userInfo != NULL)
             sessionId = userInfo->GetMgSessionId();
 
-        RS_MapUIInfo mapInfo(sessionId, map->GetName(), L"", srs, units, layoutColor);
+        RS_MapUIInfo mapInfo(sessionId, map->GetName(), L"", srs, units, layoutColor, center->GetX(), center->GetY(), dMapScale);
 
         // Dynamically adjust the width and height of the map
         printLayout->ComputeMapOffsetAndSize(dMapScale, extents, metersPerUnit, dr.mapOffsetX(), dr.mapOffsetY(), dr.mapWidth(), dr.mapHeight(), mapPlot->GetExpandToFit());
@@ -1419,8 +1429,12 @@
     double metersPerUnit = (dstCs.p) ? dstCs->ConvertCoordinateSystemUnitsToMeters(1.0) : 1.0;
     RS_String units = (dstCs.p) ? dstCs->GetUnits() : L"";
 
+    Ptr<MgPoint> ptCenter = map->GetViewCenter();
+    Ptr<MgCoordinate> coord = ptCenter->GetCoordinate();
+    double dMapScale = map->GetViewScale();
+
     RS_Color mapBgColor(255, 255, 255, 0);
-    RS_MapUIInfo mapInfo(L"", map->GetName(), L"", srs, units, mapBgColor);
+    RS_MapUIInfo mapInfo(L"", map->GetName(), L"", srs, units, mapBgColor, coord->GetX(), coord->GetY(), dMapScale);
 
     double dpi = map->GetDisplayDpi();
     dr.StartMap(&mapInfo, b, scale, dpi, metersPerUnit);

Modified: trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp
===================================================================
--- trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -985,7 +985,9 @@
 
     STRING format = options->GetImageFormat();
 
-    RS_MapUIInfo mapInfo(sessionId, map->GetName(), map->GetObjectId(), srs, units, bgcolor);
+    Ptr<MgPoint> ptCenter = map->GetViewCenter();
+    Ptr<MgCoordinate> coord = ptCenter->GetCoordinate();
+    RS_MapUIInfo mapInfo(sessionId, map->GetName(), map->GetObjectId(), srs, units, bgcolor, coord->GetX(), coord->GetY(), scale);
 
     // begin map stylization
     dr->StartMap(&mapInfo, b, scale, map->GetDisplayDpi(), map->GetMetersPerUnit(), NULL);
@@ -1228,7 +1230,7 @@
     // begin map stylization
     RS_Color bgcolor(0, 0, 0, 255); // not used
     STRING srs = map->GetMapSRS();
-    RS_MapUIInfo mapInfo(sessionId, map->GetName(), map->GetObjectId(), srs, L"", bgcolor);
+    RS_MapUIInfo mapInfo(sessionId, map->GetName(), map->GetObjectId(), srs, L"", bgcolor, center->GetX(), center->GetY(), scale);
 
     // initialize the stylizer
     SEMgSymbolManager semgr(m_svcResource);
@@ -1384,7 +1386,9 @@
                     //for the first feature hit
 
                     RS_UIGraphic uig(NULL, 0, L"");
+                    Ptr<MgResourceIdentifier> layerDefId = layer->GetLayerDefinition();
                     RS_LayerUIInfo layerinfo(layer->GetName(),
+                                             layerDefId->ToString(),
                                              layer->GetObjectId(), // object ID
                                              true,   // selectable
                                              true,   // visible
@@ -1406,7 +1410,7 @@
                     //string the viewer should be displaying as the name of each
                     //feature property
                     // TODO: can FeatureName be an extension name rather than a FeatureClass?
-                    RS_FeatureClassInfo fcinfo(vl->GetFeatureName());
+                    RS_FeatureClassInfo fcinfo(vl->GetFeatureName(), vl->GetResourceID());
 
                     MdfModel::NameStringPairCollection* pmappings = vl->GetPropertyMappings();
                     for (int i=0; i<pmappings->GetCount(); i++)

Modified: trunk/MgDev/Server/src/UnitTesting/TestRenderingService.cpp
===================================================================
--- trunk/MgDev/Server/src/UnitTesting/TestRenderingService.cpp	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Server/src/UnitTesting/TestRenderingService.cpp	2013-05-06 12:46:20 UTC (rev 7477)
@@ -359,12 +359,22 @@
         // publish the resource data
         Ptr<MgByteSource> dataSource6 = new MgByteSource(L"../UnitTestFiles/UT_RoadCenterLines.sdf", false);
         Ptr<MgByteReader> dataReader6 = dataSource6->GetReader();
-        m_svcResource->SetResourceData(fsres5, L"UT_RoadCenterLines.sdf", L"File", dataReader6);
+        m_svcResource->SetResourceData(fsres6, L"UT_RoadCenterLines.sdf", L"File", dataReader6);
 
         Ptr<MgByteSource> dataSource7 = new MgByteSource(L"../UnitTestFiles/UT_VotingDistricts.sdf", false);
         Ptr<MgByteReader> dataReader7 = dataSource7->GetReader();
-        m_svcResource->SetResourceData(fsres6, L"UT_VotingDistricts.sdf", L"File", dataReader7);
+        m_svcResource->SetResourceData(fsres7, L"UT_VotingDistricts.sdf", L"File", dataReader7);
 
+        // Data related to stylization function tests
+        Ptr<MgResourceIdentifier> ldfres14 = new MgResourceIdentifier(L"Library://UnitTests/Layers/StylizationFuncs.LayerDefinition");
+        Ptr<MgByteSource> ldfsrc14 = new MgByteSource(L"../UnitTestFiles/UT_VotingDistrictsFunctions.ldf", false);
+        Ptr<MgByteReader> ldfrdr14 = ldfsrc14->GetReader();
+        m_svcResource->SetResource(ldfres14, ldfrdr14, NULL);
+
+        Ptr<MgResourceIdentifier> mapres15 = new MgResourceIdentifier(L"Library://UnitTests/Maps/StylizationFuncs.MapDefinition");
+        Ptr<MgByteSource> mdfsrc15 = new MgByteSource(L"../UnitTestFiles/UT_StylizationFuncs.mdf", false);
+        Ptr<MgByteReader> mdfrdr15 = mdfsrc15->GetReader();
+        m_svcResource->SetResource(mapres15, mdfrdr15, NULL);
     }
     catch (MgException* e)
     {
@@ -490,6 +500,13 @@
         Ptr<MgResourceIdentifier> fsres7 = new MgResourceIdentifier(L"Library://UnitTests/Data/VotingDistricts.FeatureSource");
         m_svcResource->DeleteResource(fsres7);
 
+        // Data related to stylization function tests
+        Ptr<MgResourceIdentifier> ldfres14 = new MgResourceIdentifier(L"Library://UnitTests/Layers/StylizationFuncs.LayerDefinition");
+        m_svcResource->GetResourceHeader(ldfres14);
+
+        Ptr<MgResourceIdentifier> mapres15 = new MgResourceIdentifier(L"Library://UnitTests/Maps/StylizationFuncs.MapDefinition");
+        m_svcResource->GetResourceHeader(mapres15);
+
         #ifdef _DEBUG
         MgFdoConnectionManager* pFdoConnectionManager = MgFdoConnectionManager::GetInstance();
         if(pFdoConnectionManager)
@@ -727,7 +744,42 @@
     }
 }
 
+void TestRenderingService::TestCase_StylizationFunctions(CREFSTRING imageFormat, CREFSTRING extension)
+{
+    try
+    {
+        Ptr<MgMap> map = CreateTestStylizationFunctionMap();
+        
+        // call the API using a scale of 75000
+        map->SetViewScale(75000.0);
 
+        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderDynamicOverlay(map, NULL, imageFormat);
+        rdr1->ToFile(GetPath(L"../UnitTestFiles/StylizationFunc_75k", imageFormat, extension));
+
+        // call the API using a scale of 12000
+        map->SetViewScale(12000);
+        Ptr<MgByteReader> rdr2 = m_svcRendering->RenderDynamicOverlay(map, NULL, imageFormat);
+        rdr2->ToFile(GetPath(L"../UnitTestFiles/StylizationFunc_12k", imageFormat, extension));
+
+        // Move around
+        Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733753, 43.746899);
+        Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
+        map->SetViewCenter(ptNewCenter);
+        Ptr<MgByteReader> rdr3 = m_svcRendering->RenderDynamicOverlay(map, NULL, imageFormat);
+        rdr3->ToFile(GetPath(L"../UnitTestFiles/StylizationFunc_12k_Moved", 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
@@ -735,8 +787,8 @@
         // make a runtime map
         Ptr<MgMap> map = CreateTestMap();
 
-        // call the API using a scale of 75000
-        map->SetViewScale(75000.0);
+        // call the API using a scale of 60000
+        map->SetViewScale(60000.0);
 
         Ptr<MgStringCollection> layerNames1 = new MgStringCollection();
         layerNames1->Add(L"Rail");
@@ -799,6 +851,23 @@
     return map;
 }
 
+MgMap* TestRenderingService::CreateTestStylizationFunctionMap()
+{
+    Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/StylizationFuncs.MapDefinition");
+    MgMap* map = new MgMap(m_siteConnection);
+    map->Create(mdfres, L"StylizationFuncs");
+
+    Ptr<MgCoordinate> coordNewCenter = new MgCoordinateXY(-87.733253, 43.746199);
+    Ptr<MgPoint> ptNewCenter = new MgPoint(coordNewCenter);
+    map->SetViewCenter(ptNewCenter);
+    map->SetViewScale(60000.0);
+    map->SetDisplayDpi(96);
+    map->SetDisplayWidth(1024);
+    map->SetDisplayHeight(1024);
+
+    return map;
+}
+
 MgMap* TestRenderingService::CreateTestTiledMap()
 {
     Ptr<MgResourceIdentifier> mdfres = new MgResourceIdentifier(L"Library://UnitTests/Maps/BaseMap.MapDefinition");

Modified: trunk/MgDev/Server/src/UnitTesting/TestRenderingService.h
===================================================================
--- trunk/MgDev/Server/src/UnitTesting/TestRenderingService.h	2013-05-06 10:37:11 UTC (rev 7476)
+++ trunk/MgDev/Server/src/UnitTesting/TestRenderingService.h	2013-05-06 12:46:20 UTC (rev 7477)
@@ -25,6 +25,8 @@
     CPPUNIT_TEST_SUITE(TestRenderingService);
     CPPUNIT_TEST(TestStart); // This must be the very first unit test
 
+    CPPUNIT_TEST(TestCase_StylizationFunctionsPNG);
+
     CPPUNIT_TEST(TestCase_SymbologyPointsPNG);
     CPPUNIT_TEST(TestCase_SymbologyPointsParamPNG);
     CPPUNIT_TEST(TestCase_SymbologyLinesPNG);
@@ -41,6 +43,8 @@
     CPPUNIT_TEST(TestCase_RenderMapWithWatermarkPNG);
     CPPUNIT_TEST(TestCase_RenderLegendPNG);
 
+    CPPUNIT_TEST(TestCase_StylizationFunctionsPNG8);
+
 	CPPUNIT_TEST(TestCase_SymbologyPointsPNG8);
     CPPUNIT_TEST(TestCase_SymbologyPointsParamPNG8);
     CPPUNIT_TEST(TestCase_SymbologyLinesPNG8);
@@ -57,6 +61,8 @@
     CPPUNIT_TEST(TestCase_RenderMapWithWatermarkPNG8);
     CPPUNIT_TEST(TestCase_RenderLegendPNG8);
 
+    CPPUNIT_TEST(TestCase_StylizationFunctionsGIF);
+
 	CPPUNIT_TEST(TestCase_SymbologyPointsGIF);
     CPPUNIT_TEST(TestCase_SymbologyPointsParamGIF);
     CPPUNIT_TEST(TestCase_SymbologyLinesGIF);
@@ -73,6 +79,8 @@
     CPPUNIT_TEST(TestCase_RenderMapWithWatermarkGIF);
     CPPUNIT_TEST(TestCase_RenderLegendGIF);
 
+    CPPUNIT_TEST(TestCase_StylizationFunctionsJPG);
+
 	CPPUNIT_TEST(TestCase_SymbologyPointsJPG);
     CPPUNIT_TEST(TestCase_SymbologyPointsParamJPG);
     CPPUNIT_TEST(TestCase_SymbologyLinesJPG);
@@ -124,6 +132,8 @@
     void TestCase_Annotation2(CREFSTRING imageFormat, CREFSTRING extension);
     void TestCase_Annotation3(CREFSTRING imageFormat, CREFSTRING extension);
 
+    void TestCase_StylizationFunctions(CREFSTRING imageFormat, CREFSTRING extension);
+
 	//PNG output tests
 	void TestCase_RenderDynamicOverlayPNG() { TestCase_RenderDynamicOverlay(L"PNG", L"png"); }
     void TestCase_RenderDynamicOverlayTiledMapPNG() { TestCase_RenderDynamicOverlayTiledMap(L"PNG", L"png"); }
@@ -138,6 +148,7 @@
     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_StylizationFunctionsPNG() { TestCase_StylizationFunctions(L"PNG", L"png"); }
 
 	//PNG8 output tests
 	void TestCase_RenderDynamicOverlayPNG8() { TestCase_RenderDynamicOverlay(L"PNG8", L"png"); }
@@ -153,6 +164,7 @@
     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_StylizationFunctionsPNG8() { TestCase_StylizationFunctions(L"PNG8", L"png"); }
 
 	//GIF output tests
 	void TestCase_RenderDynamicOverlayGIF() { TestCase_RenderDynamicOverlay(L"GIF", L"gif"); }
@@ -168,6 +180,7 @@
     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_StylizationFunctionsGIF() { TestCase_StylizationFunctions(L"GIF", L"gif"); }
 
 	//JPG output tests
 	void TestCase_RenderDynamicOverlayJPG() { TestCase_RenderDynamicOverlay(L"JPG", L"jpg"); }
@@ -183,12 +196,14 @@
     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_StylizationFunctionsJPG() { TestCase_StylizationFunctions(L"JPG", L"jpg"); }
 
     //void TestCase_RendererPerformance();
 
 private:
     MgMap* CreateTestMap();
     MgMap* CreateTestTiledMap();
+    MgMap* CreateTestStylizationFunctionMap();
     MgMap* CreateTestMapWithWatermark();
     MgPolygon* CreateSelectionPolygon(MgMap* map, double width, double height);
 	static STRING GetPath(CREFSTRING basePath, CREFSTRING imageFormat, CREFSTRING extension);

Copied: trunk/MgDev/UnitTest/TestData/TileService/UT_StylizationFuncs.mdf (from rev 7462, sandbox/jng/extra_stylization_funcs/UnitTest/TestData/TileService/UT_StylizationFuncs.mdf)
===================================================================
--- trunk/MgDev/UnitTest/TestData/TileService/UT_StylizationFuncs.mdf	                        (rev 0)
+++ trunk/MgDev/UnitTest/TestData/TileService/UT_StylizationFuncs.mdf	2013-05-06 12:46:20 UTC (rev 7477)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<MapDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="2.4.0" xsi:noNamespaceSchemaLocation="MapDefinition-2.4.0.xsd">
+  <Name />
+  <CoordinateSystem>GEOGCS["WGS84 Lat/Long's, Degrees, -180 ==> +180",DATUM["D_WGS_1984",SPHEROID["World_Geodetic_System_of_1984",6378137,298.257222932867]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]</CoordinateSystem>
+  <Extents>
+    <MinX>-87.764986236796631</MinX>
+    <MaxX>-87.695517537538109</MaxX>
+    <MinY>43.691398447253356</MinY>
+    <MaxY>43.7975198255836</MaxY>
+  </Extents>
+  <BackgroundColor>ffffffff</BackgroundColor>
+  <MapLayer>
+    <Name>StylizationTest</Name>
+    <ResourceId>Library://UnitTests/Layers/StylizationFuncs.LayerDefinition</ResourceId>
+    <Selectable>true</Selectable>
+    <ShowInLegend>true</ShowInLegend>
+    <LegendLabel>StylizationTest</LegendLabel>
+    <ExpandInLegend>true</ExpandInLegend>
+    <Visible>true</Visible>
+    <Group />
+  </MapLayer>
+  <Watermarks />
+</MapDefinition>
\ No newline at end of file

Copied: trunk/MgDev/UnitTest/TestData/TileService/UT_VotingDistrictsFunctions.ldf (from rev 7462, sandbox/jng/extra_stylization_funcs/UnitTest/TestData/TileService/UT_VotingDistrictsFunctions.ldf)
===================================================================
--- trunk/MgDev/UnitTest/TestData/TileService/UT_VotingDistrictsFunctions.ldf	                        (rev 0)
+++ trunk/MgDev/UnitTest/TestData/TileService/UT_VotingDistrictsFunctions.ldf	2013-05-06 12:46:20 UTC (rev 7477)
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<LayerDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="LayerDefinition-1.2.0.xsd" version="1.2.0">
+  <VectorLayerDefinition>
+    <ResourceId>Library://UnitTests/Data/VotingDistricts.FeatureSource</ResourceId>
+    <FeatureName>Default:VotingDistricts</FeatureName>
+    <FeatureNameType>FeatureClass</FeatureNameType>
+    <PropertyMapping>
+      <Name>NAME</Name>
+      <Value>NAME</Value>
+    </PropertyMapping>
+    <Geometry>Geometry</Geometry>
+    <VectorScaleRange>
+      <AreaTypeStyle>
+        <AreaRule>
+          <LegendLabel></LegendLabel>
+          <Label>
+            <Unit>Centimeters</Unit>
+            <SizeContext>DeviceUnits</SizeContext>
+            <SizeX>0.3</SizeX>
+            <SizeY>0.3</SizeY>
+            <Text>concat('HTML Color: ', HTMLCOLOR(255, 0, 14), '\nFeature Source: ', FEATURESOURCE(), '\nLayer Definition: ', LAYERDEFINITION(), '\nMap Scale: ', MAPSCALE(), '\nMap Center (X): ', MAPCENTERX(), '\nMap Center (Y): ', MAPCENTERY(), '\nColor: ', ARGB(0, 255, 0, 255), '\nDecap: ', DECAP('HELLO WORLD'), '\nFeature Class: ', FEATURECLASS(), '\nFeature ID: ', FEATUREID(), '\nIf result (Built after 1980?): ', IF('YRBUILT &gt; 1980', 'Yes', 'No'), '\nLayer ID: ', LAYERID(), '\nLookup Example (based on FeatId): ', Lookup( FeatId , 'FeatId unknown or empty', 1, 'one', 2, 'two', 3, 'three', 4, 'four', 5, 'five', 6, 'six', 7, 'seven', 8, 'eight', 9, 'nine', 10, 'ten'), '\nMap Name: ', MAPNAME(), '\nSession ID: ', SESSION(), '\nRange Example (FeatId): ', RANGE( FeatId , 'Unknown', 1, 3, '1-3', 3, 6,'3-6', 6, 10, '6 - 10'), '\nURL Encode example: ', URLENCODE('http://www.google.com/?foo=bar'))</Text>
+            <FontName>Arial</FontName>
+            <ForegroundColor>ff000000</ForegroundColor>
+            <BackgroundColor>ffffffff</BackgroundColor>
+            <BackgroundStyle>Ghosted</BackgroundStyle>
+            <VerticalAlignment>'Halfline'</VerticalAlignment>
+            <AdvancedPlacement>
+              <ScaleLimit>0.5</ScaleLimit>
+            </AdvancedPlacement>
+          </Label>
+          <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>DeviceUnits</SizeContext>
+            </Stroke>
+          </AreaSymbolization2D>
+        </AreaRule>
+      </AreaTypeStyle>
+    </VectorScaleRange>
+  </VectorLayerDefinition>
+</LayerDefinition>



More information about the mapguide-commits mailing list