[mapguide-commits] r4700 - in sandbox/rfc90: . MgDev/Common/MapGuideCommon/Services MgDev/Common/MapGuideCommon/System MgDev/Common/Renderers MgDev/Server MgDev/Server/src/Core MgDev/Server/src/PostBuild MgDev/Server/src/Services/Rendering MgDev/Server/src/Services/Tile

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Thu Mar 25 23:01:24 EDT 2010


Author: uvlite
Date: 2010-03-25 23:01:23 -0400 (Thu, 25 Mar 2010)
New Revision: 4700

Added:
   sandbox/rfc90/MgDev/
Modified:
   sandbox/rfc90/MgDev/Common/MapGuideCommon/Services/ProxyRenderingService.h
   sandbox/rfc90/MgDev/Common/MapGuideCommon/Services/RenderingService.h
   sandbox/rfc90/MgDev/Common/MapGuideCommon/Services/TileService.h
   sandbox/rfc90/MgDev/Common/MapGuideCommon/System/ConfigProperties.cpp
   sandbox/rfc90/MgDev/Common/MapGuideCommon/System/ConfigProperties.h
   sandbox/rfc90/MgDev/Common/Renderers/AGGImageIO.cpp
   sandbox/rfc90/MgDev/Common/Renderers/AGGRenderer.cpp
   sandbox/rfc90/MgDev/Common/Renderers/AGGRenderer.h
   sandbox/rfc90/MgDev/Server/Server.sln
   sandbox/rfc90/MgDev/Server/src/Core/serverconfig.ini
   sandbox/rfc90/MgDev/Server/src/PostBuild/PostBuild.mak
   sandbox/rfc90/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp
   sandbox/rfc90/MgDev/Server/src/Services/Rendering/ServerRenderingService.h
   sandbox/rfc90/MgDev/Server/src/Services/Rendering/ServerRenderingService.vcproj
   sandbox/rfc90/MgDev/Server/src/Services/Tile/ServerTileService.cpp
   sandbox/rfc90/MgDev/Server/src/Services/Tile/ServerTileService.h
   sandbox/rfc90/MgDev/Server/src/Services/Tile/ServerTileService.vcproj
Log:
Branch Rev 4697 to rfc90 sandbox

Modified: sandbox/rfc90/MgDev/Common/MapGuideCommon/Services/ProxyRenderingService.h
===================================================================
--- trunk/MgDev/Common/MapGuideCommon/Services/ProxyRenderingService.h	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Common/MapGuideCommon/Services/ProxyRenderingService.h	2010-03-26 03:01:23 UTC (rev 4700)
@@ -576,6 +576,8 @@
     ///
     MgProxyRenderingService();
 
+//    virtual MgByteReader* RenderFromMetaTile(MgMap* map, MgByteReader* metaTile, INT32 x, INT32 y, INT32 tileSize);
+
     DECLARE_CREATE_SERVICE()
 
     //////////////////////////////////////////////////////////////////

Modified: sandbox/rfc90/MgDev/Common/MapGuideCommon/Services/RenderingService.h
===================================================================
--- trunk/MgDev/Common/MapGuideCommon/Services/RenderingService.h	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Common/MapGuideCommon/Services/RenderingService.h	2010-03-26 03:01:23 UTC (rev 4700)
@@ -582,6 +582,8 @@
     ///
     MgRenderingService();
 
+//    virtual MgByteReader* RenderFromMetaTile(MgMap* map, MgByteReader* metaTile, INT32 x, INT32 y, INT32 tileSize) = 0;
+
 protected:
 
     /////////////////////////////////////////////////////////////////

Modified: sandbox/rfc90/MgDev/Common/MapGuideCommon/Services/TileService.h
===================================================================
--- trunk/MgDev/Common/MapGuideCommon/Services/TileService.h	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Common/MapGuideCommon/Services/TileService.h	2010-03-26 03:01:23 UTC (rev 4700)
@@ -154,7 +154,7 @@
         INT32 tileColumn,
         INT32 tileRow) = 0;
 
-    //////////////////////////////////////////////////////////////////
+     //////////////////////////////////////////////////////////////////
     /// \brief
     /// Construct an MgTileService object.
     ///

Modified: sandbox/rfc90/MgDev/Common/MapGuideCommon/System/ConfigProperties.cpp
===================================================================
--- trunk/MgDev/Common/MapGuideCommon/System/ConfigProperties.cpp	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Common/MapGuideCommon/System/ConfigProperties.cpp	2010-03-26 03:01:23 UTC (rev 4700)
@@ -375,6 +375,8 @@
 const INT32 MgConfigProperties::DefaultTileServicePropertyTileSizeY                         = 300;
 const STRING MgConfigProperties::TileServicePropertyImageFormat                             = L"ImageFormat";
 const STRING MgConfigProperties::DefaultTileServicePropertyImageFormat                      = L"PNG";
+const STRING MgConfigProperties::TileServicePropertyUseMetaTiles                            = L"UseMetaTiles";
+const INT32 MgConfigProperties::DefaultTileServicePropertyUseMetaTiles                      = 0;
 
 // ******************************************************************
 // Access Log Properties

Modified: sandbox/rfc90/MgDev/Common/MapGuideCommon/System/ConfigProperties.h
===================================================================
--- trunk/MgDev/Common/MapGuideCommon/System/ConfigProperties.h	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Common/MapGuideCommon/System/ConfigProperties.h	2010-03-26 03:01:23 UTC (rev 4700)
@@ -510,6 +510,10 @@
     static const STRING TileServicePropertyTiledMapCacheSize;           /// value("TiledMapCacheSize")
     static const INT32 DefaultTileServicePropertyTiledMapCacheSize;     /// value(10)
 
+    /// Sets the number of metatiles used for tile generation
+    static const STRING TileServicePropertyUseMetaTiles;                /// value("UseMetaTiles")
+    static const INT32 DefaultTileServicePropertyUseMetaTiles;          /// value(0)
+
 EXTERNAL_API:
 
     //////////////////////////////////////////////////////////////////

Modified: sandbox/rfc90/MgDev/Common/Renderers/AGGImageIO.cpp
===================================================================
--- trunk/MgDev/Common/Renderers/AGGImageIO.cpp	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Common/Renderers/AGGImageIO.cpp	2010-03-26 03:01:23 UTC (rev 4700)
@@ -968,15 +968,25 @@
 
         //NOTE: We do not use gd for reading or writing PNG since internally gd drops a bit
         //from the alpha channel, which is not desirable for high quality output
+        //if (format == L"META")      // return bitmap only if rendering metatiles
+        //{
+        //    return new RS_ByteData((unsigned char*) src, src_width * src_height * 4); // 32 bit pixels
+        //}
+        //else 
         if (format == L"PNG")
         {
             png_write_context cxt;
             memset(&cxt, 0, sizeof(cxt));
             write_png(&cxt, src, dst_width, dst_height, gamma, drop_alpha);
 
-            RS_ByteData* byteData = (cxt.used > 0)? new RS_ByteData(cxt.buf, (unsigned int)cxt.used) : NULL;
-            delete [] cxt.buf;
-            return byteData;
+            if (cxt.used > 0) 
+            {
+                std::auto_ptr<RS_ByteData> byteData;
+                byteData.reset(new RS_ByteData(cxt.buf, (unsigned int)cxt.used));
+                delete [] cxt.buf;
+                return byteData.release();
+            } else
+                return NULL;
         }
         else if (format == L"JPG" || format == L"GIF" || format == L"PNG8")
         {
@@ -1053,7 +1063,9 @@
             int size = 0;
             unsigned char* data = NULL;
 
-            if (format == L"GIF")       // MgImageFormats::Gif
+            if (format == L"META")       // meta tiling.... keep the raster for now
+                data = (unsigned char*)gdImgPalette;
+            else if (format == L"GIF")       // MgImageFormats::Gif
                 data = (unsigned char*)gdImageGifPtr(gdImgPalette, &size);
             else if (format == L"PNG8") // MgImageFormats::Png8
                 data = (unsigned char*)gdImagePngPtr(gdImgPalette, &size);

Modified: sandbox/rfc90/MgDev/Common/Renderers/AGGRenderer.cpp
===================================================================
--- trunk/MgDev/Common/Renderers/AGGRenderer.cpp	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Common/Renderers/AGGRenderer.cpp	2010-03-26 03:01:23 UTC (rev 4700)
@@ -16,7 +16,7 @@
 //
 
 #include "stdafx.h"
-
+#include "assert.h"
 #include "AGGRenderer.h"
 #include "LineStyle.h"
 #include "SLDSymbols.h"
@@ -254,12 +254,37 @@
 // a bytestream in the given image format using the provided colorPalette
 // if given.
 RS_ByteData* AGGRenderer::Save(const RS_String& format, int width, int height,
-                               RS_ColorVector* baseColorPalette)
+                               RS_ColorVector* baseColorPalette, unsigned int* imagebuffer)
 {
+    if (format == L"META")
+    {
+        assert (imagebuffer == NULL);  // this musnt happen
+        int imagebufferByteSize = width*height*4; // multiply 32 bit pixel by 4 bytes
+        // m_bownbuffer = false;   // take ownership of rendered imagebuffer for to create subtiles later
+        //auto_ptr<RS_ByteData> retVal;
+        //retVal.reset(new RS_ByteData((unsigned char*) m_rows, imagebufferByteSize));
+        //return retVal.release();
+        // the RS_ByteData CTOR memcopies the source
+        return new RS_ByteData((unsigned char*) m_rows, imagebufferByteSize);
+    } else {
+        if (imagebuffer)       // use imagebuffer from previous meta tiling pass
+            return AGGImageIO::Save(format, imagebuffer, m_width, m_height, width, height, m_bgcolor, baseColorPalette);
+        else
+            return AGGImageIO::Save(format, m_rows, m_width, m_height, width, height, m_bgcolor, baseColorPalette);
+    }
+}
+
+/*
+//////////////////////////////////////////////////////////////////////////////
+// Return the rendered image passed in via the imagebuffer (m_rows) as
+// a bytestream in the given image format using the provided colorPalette
+// if given.
+RS_ByteData* AGGRenderer::Save(const RS_String& format, int width, int height)
+{
     return AGGImageIO::Save(format, m_rows, m_width, m_height, width, height, m_bgcolor, baseColorPalette);
 }
 
-
+*/
 //////////////////////////////////////////////////////////////////////////////
 void AGGRenderer::Combine(const RS_String& fileIn1, const RS_String& fileIn2, const RS_String& fileOut)
 {

Modified: sandbox/rfc90/MgDev/Common/Renderers/AGGRenderer.h
===================================================================
--- trunk/MgDev/Common/Renderers/AGGRenderer.h	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Common/Renderers/AGGRenderer.h	2010-03-26 03:01:23 UTC (rev 4700)
@@ -152,7 +152,7 @@
     RENDERERS_API void Save(const RS_String& filename, const RS_String& format);
     RENDERERS_API void Save(const RS_String& filename, const RS_String& format, int width, int height);
     RENDERERS_API RS_ByteData* Save(const RS_String& format, int width, int height,
-                                    RS_ColorVector* baseColorPalette = NULL);
+                                    RS_ColorVector* baseColorPalette = NULL, unsigned int * framebuf = NULL);
 
     RENDERERS_API void Combine(const RS_String& fileIn1, const RS_String& fileIn2, const RS_String& fileOut);
     RENDERERS_API void SetWorldToScreenTransform(SE_Matrix& xform);

Modified: sandbox/rfc90/MgDev/Server/Server.sln
===================================================================
--- trunk/MgDev/Server/Server.sln	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Server/Server.sln	2010-03-26 03:01:23 UTC (rev 4700)
@@ -296,240 +296,418 @@
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug Static|Win32 = Debug Static|Win32
+		Debug Static|x64 = Debug Static|x64
 		Debug|Win32 = Debug|Win32
 		Debug|x64 = Debug|x64
+		Release Static|Win32 = Release Static|Win32
+		Release Static|x64 = Release Static|x64
 		Release|Win32 = Release|Win32
 		Release|x64 = Release|x64
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{FDF553DE-0D30-4456-8A84-5009C9EAAED2}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{FDF553DE-0D30-4456-8A84-5009C9EAAED2}.Debug Static|x64.ActiveCfg = Debug|x64
+		{FDF553DE-0D30-4456-8A84-5009C9EAAED2}.Debug Static|x64.Build.0 = Debug|x64
 		{FDF553DE-0D30-4456-8A84-5009C9EAAED2}.Debug|Win32.ActiveCfg = Debug|Win32
 		{FDF553DE-0D30-4456-8A84-5009C9EAAED2}.Debug|Win32.Build.0 = Debug|Win32
 		{FDF553DE-0D30-4456-8A84-5009C9EAAED2}.Debug|x64.ActiveCfg = Debug|x64
 		{FDF553DE-0D30-4456-8A84-5009C9EAAED2}.Debug|x64.Build.0 = Debug|x64
+		{FDF553DE-0D30-4456-8A84-5009C9EAAED2}.Release Static|Win32.ActiveCfg = Release|x64
+		{FDF553DE-0D30-4456-8A84-5009C9EAAED2}.Release Static|x64.ActiveCfg = Release|x64
+		{FDF553DE-0D30-4456-8A84-5009C9EAAED2}.Release Static|x64.Build.0 = Release|x64
 		{FDF553DE-0D30-4456-8A84-5009C9EAAED2}.Release|Win32.ActiveCfg = Release|Win32
 		{FDF553DE-0D30-4456-8A84-5009C9EAAED2}.Release|Win32.Build.0 = Release|Win32
 		{FDF553DE-0D30-4456-8A84-5009C9EAAED2}.Release|x64.ActiveCfg = Release|x64
 		{FDF553DE-0D30-4456-8A84-5009C9EAAED2}.Release|x64.Build.0 = Release|x64
+		{A82ADC7D-4DA4-42F2-9BF6-DF5DCFB44425}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{A82ADC7D-4DA4-42F2-9BF6-DF5DCFB44425}.Debug Static|x64.ActiveCfg = Debug|x64
+		{A82ADC7D-4DA4-42F2-9BF6-DF5DCFB44425}.Debug Static|x64.Build.0 = Debug|x64
 		{A82ADC7D-4DA4-42F2-9BF6-DF5DCFB44425}.Debug|Win32.ActiveCfg = Debug|Win32
 		{A82ADC7D-4DA4-42F2-9BF6-DF5DCFB44425}.Debug|Win32.Build.0 = Debug|Win32
 		{A82ADC7D-4DA4-42F2-9BF6-DF5DCFB44425}.Debug|x64.ActiveCfg = Debug|x64
 		{A82ADC7D-4DA4-42F2-9BF6-DF5DCFB44425}.Debug|x64.Build.0 = Debug|x64
+		{A82ADC7D-4DA4-42F2-9BF6-DF5DCFB44425}.Release Static|Win32.ActiveCfg = Release|x64
+		{A82ADC7D-4DA4-42F2-9BF6-DF5DCFB44425}.Release Static|x64.ActiveCfg = Release|x64
+		{A82ADC7D-4DA4-42F2-9BF6-DF5DCFB44425}.Release Static|x64.Build.0 = Release|x64
 		{A82ADC7D-4DA4-42F2-9BF6-DF5DCFB44425}.Release|Win32.ActiveCfg = Release|Win32
 		{A82ADC7D-4DA4-42F2-9BF6-DF5DCFB44425}.Release|Win32.Build.0 = Release|Win32
 		{A82ADC7D-4DA4-42F2-9BF6-DF5DCFB44425}.Release|x64.ActiveCfg = Release|x64
 		{A82ADC7D-4DA4-42F2-9BF6-DF5DCFB44425}.Release|x64.Build.0 = Release|x64
+		{D954DAAC-E305-40CE-B3F3-C229A0BEF4F0}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{D954DAAC-E305-40CE-B3F3-C229A0BEF4F0}.Debug Static|x64.ActiveCfg = Debug|x64
+		{D954DAAC-E305-40CE-B3F3-C229A0BEF4F0}.Debug Static|x64.Build.0 = Debug|x64
 		{D954DAAC-E305-40CE-B3F3-C229A0BEF4F0}.Debug|Win32.ActiveCfg = Debug|Win32
 		{D954DAAC-E305-40CE-B3F3-C229A0BEF4F0}.Debug|Win32.Build.0 = Debug|Win32
 		{D954DAAC-E305-40CE-B3F3-C229A0BEF4F0}.Debug|x64.ActiveCfg = Debug|x64
 		{D954DAAC-E305-40CE-B3F3-C229A0BEF4F0}.Debug|x64.Build.0 = Debug|x64
+		{D954DAAC-E305-40CE-B3F3-C229A0BEF4F0}.Release Static|Win32.ActiveCfg = Release|x64
+		{D954DAAC-E305-40CE-B3F3-C229A0BEF4F0}.Release Static|x64.ActiveCfg = Release|x64
+		{D954DAAC-E305-40CE-B3F3-C229A0BEF4F0}.Release Static|x64.Build.0 = Release|x64
 		{D954DAAC-E305-40CE-B3F3-C229A0BEF4F0}.Release|Win32.ActiveCfg = Release|Win32
 		{D954DAAC-E305-40CE-B3F3-C229A0BEF4F0}.Release|Win32.Build.0 = Release|Win32
 		{D954DAAC-E305-40CE-B3F3-C229A0BEF4F0}.Release|x64.ActiveCfg = Release|x64
 		{D954DAAC-E305-40CE-B3F3-C229A0BEF4F0}.Release|x64.Build.0 = Release|x64
+		{5287A594-4D4F-43FE-A281-E279AB708CF1}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{5287A594-4D4F-43FE-A281-E279AB708CF1}.Debug Static|x64.ActiveCfg = Debug|x64
+		{5287A594-4D4F-43FE-A281-E279AB708CF1}.Debug Static|x64.Build.0 = Debug|x64
 		{5287A594-4D4F-43FE-A281-E279AB708CF1}.Debug|Win32.ActiveCfg = Debug|Win32
 		{5287A594-4D4F-43FE-A281-E279AB708CF1}.Debug|Win32.Build.0 = Debug|Win32
 		{5287A594-4D4F-43FE-A281-E279AB708CF1}.Debug|x64.ActiveCfg = Debug|x64
 		{5287A594-4D4F-43FE-A281-E279AB708CF1}.Debug|x64.Build.0 = Debug|x64
+		{5287A594-4D4F-43FE-A281-E279AB708CF1}.Release Static|Win32.ActiveCfg = Release|x64
+		{5287A594-4D4F-43FE-A281-E279AB708CF1}.Release Static|x64.ActiveCfg = Release|x64
+		{5287A594-4D4F-43FE-A281-E279AB708CF1}.Release Static|x64.Build.0 = Release|x64
 		{5287A594-4D4F-43FE-A281-E279AB708CF1}.Release|Win32.ActiveCfg = Release|Win32
 		{5287A594-4D4F-43FE-A281-E279AB708CF1}.Release|Win32.Build.0 = Release|Win32
 		{5287A594-4D4F-43FE-A281-E279AB708CF1}.Release|x64.ActiveCfg = Release|x64
 		{5287A594-4D4F-43FE-A281-E279AB708CF1}.Release|x64.Build.0 = Release|x64
+		{C50254F2-654A-48DE-AF5B-20605AEF8D10}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{C50254F2-654A-48DE-AF5B-20605AEF8D10}.Debug Static|x64.ActiveCfg = Debug|x64
+		{C50254F2-654A-48DE-AF5B-20605AEF8D10}.Debug Static|x64.Build.0 = Debug|x64
 		{C50254F2-654A-48DE-AF5B-20605AEF8D10}.Debug|Win32.ActiveCfg = Debug|Win32
 		{C50254F2-654A-48DE-AF5B-20605AEF8D10}.Debug|Win32.Build.0 = Debug|Win32
 		{C50254F2-654A-48DE-AF5B-20605AEF8D10}.Debug|x64.ActiveCfg = Debug|x64
 		{C50254F2-654A-48DE-AF5B-20605AEF8D10}.Debug|x64.Build.0 = Debug|x64
+		{C50254F2-654A-48DE-AF5B-20605AEF8D10}.Release Static|Win32.ActiveCfg = Release|x64
+		{C50254F2-654A-48DE-AF5B-20605AEF8D10}.Release Static|x64.ActiveCfg = Release|x64
+		{C50254F2-654A-48DE-AF5B-20605AEF8D10}.Release Static|x64.Build.0 = Release|x64
 		{C50254F2-654A-48DE-AF5B-20605AEF8D10}.Release|Win32.ActiveCfg = Release|Win32
 		{C50254F2-654A-48DE-AF5B-20605AEF8D10}.Release|Win32.Build.0 = Release|Win32
 		{C50254F2-654A-48DE-AF5B-20605AEF8D10}.Release|x64.ActiveCfg = Release|x64
 		{C50254F2-654A-48DE-AF5B-20605AEF8D10}.Release|x64.Build.0 = Release|x64
+		{85882748-DD71-4D2B-9E5A-03AF8C8D91B7}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{85882748-DD71-4D2B-9E5A-03AF8C8D91B7}.Debug Static|x64.ActiveCfg = Debug|x64
+		{85882748-DD71-4D2B-9E5A-03AF8C8D91B7}.Debug Static|x64.Build.0 = Debug|x64
 		{85882748-DD71-4D2B-9E5A-03AF8C8D91B7}.Debug|Win32.ActiveCfg = Debug|Win32
 		{85882748-DD71-4D2B-9E5A-03AF8C8D91B7}.Debug|Win32.Build.0 = Debug|Win32
 		{85882748-DD71-4D2B-9E5A-03AF8C8D91B7}.Debug|x64.ActiveCfg = Debug|x64
 		{85882748-DD71-4D2B-9E5A-03AF8C8D91B7}.Debug|x64.Build.0 = Debug|x64
+		{85882748-DD71-4D2B-9E5A-03AF8C8D91B7}.Release Static|Win32.ActiveCfg = Release|x64
+		{85882748-DD71-4D2B-9E5A-03AF8C8D91B7}.Release Static|x64.ActiveCfg = Release|x64
+		{85882748-DD71-4D2B-9E5A-03AF8C8D91B7}.Release Static|x64.Build.0 = Release|x64
 		{85882748-DD71-4D2B-9E5A-03AF8C8D91B7}.Release|Win32.ActiveCfg = Release|Win32
 		{85882748-DD71-4D2B-9E5A-03AF8C8D91B7}.Release|Win32.Build.0 = Release|Win32
 		{85882748-DD71-4D2B-9E5A-03AF8C8D91B7}.Release|x64.ActiveCfg = Release|x64
 		{85882748-DD71-4D2B-9E5A-03AF8C8D91B7}.Release|x64.Build.0 = Release|x64
+		{F7334B1B-0EFA-47E3-8E66-DF158E61B7E4}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{F7334B1B-0EFA-47E3-8E66-DF158E61B7E4}.Debug Static|x64.ActiveCfg = Debug|x64
+		{F7334B1B-0EFA-47E3-8E66-DF158E61B7E4}.Debug Static|x64.Build.0 = Debug|x64
 		{F7334B1B-0EFA-47E3-8E66-DF158E61B7E4}.Debug|Win32.ActiveCfg = Debug|Win32
 		{F7334B1B-0EFA-47E3-8E66-DF158E61B7E4}.Debug|Win32.Build.0 = Debug|Win32
 		{F7334B1B-0EFA-47E3-8E66-DF158E61B7E4}.Debug|x64.ActiveCfg = Debug|x64
 		{F7334B1B-0EFA-47E3-8E66-DF158E61B7E4}.Debug|x64.Build.0 = Debug|x64
+		{F7334B1B-0EFA-47E3-8E66-DF158E61B7E4}.Release Static|Win32.ActiveCfg = Release|x64
+		{F7334B1B-0EFA-47E3-8E66-DF158E61B7E4}.Release Static|x64.ActiveCfg = Release|x64
+		{F7334B1B-0EFA-47E3-8E66-DF158E61B7E4}.Release Static|x64.Build.0 = Release|x64
 		{F7334B1B-0EFA-47E3-8E66-DF158E61B7E4}.Release|Win32.ActiveCfg = Release|Win32
 		{F7334B1B-0EFA-47E3-8E66-DF158E61B7E4}.Release|Win32.Build.0 = Release|Win32
 		{F7334B1B-0EFA-47E3-8E66-DF158E61B7E4}.Release|x64.ActiveCfg = Release|x64
 		{F7334B1B-0EFA-47E3-8E66-DF158E61B7E4}.Release|x64.Build.0 = Release|x64
+		{38161685-88ED-415E-A545-CCC17BE069AE}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{38161685-88ED-415E-A545-CCC17BE069AE}.Debug Static|x64.ActiveCfg = Debug|x64
+		{38161685-88ED-415E-A545-CCC17BE069AE}.Debug Static|x64.Build.0 = Debug|x64
 		{38161685-88ED-415E-A545-CCC17BE069AE}.Debug|Win32.ActiveCfg = Debug|Win32
 		{38161685-88ED-415E-A545-CCC17BE069AE}.Debug|Win32.Build.0 = Debug|Win32
 		{38161685-88ED-415E-A545-CCC17BE069AE}.Debug|x64.ActiveCfg = Debug|x64
 		{38161685-88ED-415E-A545-CCC17BE069AE}.Debug|x64.Build.0 = Debug|x64
+		{38161685-88ED-415E-A545-CCC17BE069AE}.Release Static|Win32.ActiveCfg = Release|x64
+		{38161685-88ED-415E-A545-CCC17BE069AE}.Release Static|x64.ActiveCfg = Release|x64
+		{38161685-88ED-415E-A545-CCC17BE069AE}.Release Static|x64.Build.0 = Release|x64
 		{38161685-88ED-415E-A545-CCC17BE069AE}.Release|Win32.ActiveCfg = Release|Win32
 		{38161685-88ED-415E-A545-CCC17BE069AE}.Release|Win32.Build.0 = Release|Win32
 		{38161685-88ED-415E-A545-CCC17BE069AE}.Release|x64.ActiveCfg = Release|x64
 		{38161685-88ED-415E-A545-CCC17BE069AE}.Release|x64.Build.0 = Release|x64
+		{7C1C5695-C51C-4017-ABEF-BC3032CBAF3B}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{7C1C5695-C51C-4017-ABEF-BC3032CBAF3B}.Debug Static|x64.ActiveCfg = Debug|x64
+		{7C1C5695-C51C-4017-ABEF-BC3032CBAF3B}.Debug Static|x64.Build.0 = Debug|x64
 		{7C1C5695-C51C-4017-ABEF-BC3032CBAF3B}.Debug|Win32.ActiveCfg = Debug|Win32
 		{7C1C5695-C51C-4017-ABEF-BC3032CBAF3B}.Debug|Win32.Build.0 = Debug|Win32
 		{7C1C5695-C51C-4017-ABEF-BC3032CBAF3B}.Debug|x64.ActiveCfg = Debug|x64
 		{7C1C5695-C51C-4017-ABEF-BC3032CBAF3B}.Debug|x64.Build.0 = Debug|x64
+		{7C1C5695-C51C-4017-ABEF-BC3032CBAF3B}.Release Static|Win32.ActiveCfg = Release|x64
+		{7C1C5695-C51C-4017-ABEF-BC3032CBAF3B}.Release Static|x64.ActiveCfg = Release|x64
+		{7C1C5695-C51C-4017-ABEF-BC3032CBAF3B}.Release Static|x64.Build.0 = Release|x64
 		{7C1C5695-C51C-4017-ABEF-BC3032CBAF3B}.Release|Win32.ActiveCfg = Release|Win32
 		{7C1C5695-C51C-4017-ABEF-BC3032CBAF3B}.Release|Win32.Build.0 = Release|Win32
 		{7C1C5695-C51C-4017-ABEF-BC3032CBAF3B}.Release|x64.ActiveCfg = Release|x64
 		{7C1C5695-C51C-4017-ABEF-BC3032CBAF3B}.Release|x64.Build.0 = Release|x64
+		{341D5463-186E-49BA-B942-3D3BE28D65C0}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{341D5463-186E-49BA-B942-3D3BE28D65C0}.Debug Static|x64.ActiveCfg = Debug|x64
+		{341D5463-186E-49BA-B942-3D3BE28D65C0}.Debug Static|x64.Build.0 = Debug|x64
 		{341D5463-186E-49BA-B942-3D3BE28D65C0}.Debug|Win32.ActiveCfg = Debug|Win32
 		{341D5463-186E-49BA-B942-3D3BE28D65C0}.Debug|Win32.Build.0 = Debug|Win32
 		{341D5463-186E-49BA-B942-3D3BE28D65C0}.Debug|x64.ActiveCfg = Debug|x64
 		{341D5463-186E-49BA-B942-3D3BE28D65C0}.Debug|x64.Build.0 = Debug|x64
+		{341D5463-186E-49BA-B942-3D3BE28D65C0}.Release Static|Win32.ActiveCfg = Release|x64
+		{341D5463-186E-49BA-B942-3D3BE28D65C0}.Release Static|x64.ActiveCfg = Release|x64
+		{341D5463-186E-49BA-B942-3D3BE28D65C0}.Release Static|x64.Build.0 = Release|x64
 		{341D5463-186E-49BA-B942-3D3BE28D65C0}.Release|Win32.ActiveCfg = Release|Win32
 		{341D5463-186E-49BA-B942-3D3BE28D65C0}.Release|Win32.Build.0 = Release|Win32
 		{341D5463-186E-49BA-B942-3D3BE28D65C0}.Release|x64.ActiveCfg = Release|x64
 		{341D5463-186E-49BA-B942-3D3BE28D65C0}.Release|x64.Build.0 = Release|x64
+		{DB2CC2E3-4754-4932-B865-424A44E58FD0}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{DB2CC2E3-4754-4932-B865-424A44E58FD0}.Debug Static|x64.ActiveCfg = Debug|x64
+		{DB2CC2E3-4754-4932-B865-424A44E58FD0}.Debug Static|x64.Build.0 = Debug|x64
 		{DB2CC2E3-4754-4932-B865-424A44E58FD0}.Debug|Win32.ActiveCfg = Debug|Win32
 		{DB2CC2E3-4754-4932-B865-424A44E58FD0}.Debug|Win32.Build.0 = Debug|Win32
 		{DB2CC2E3-4754-4932-B865-424A44E58FD0}.Debug|x64.ActiveCfg = Debug|x64
 		{DB2CC2E3-4754-4932-B865-424A44E58FD0}.Debug|x64.Build.0 = Debug|x64
+		{DB2CC2E3-4754-4932-B865-424A44E58FD0}.Release Static|Win32.ActiveCfg = Release|x64
+		{DB2CC2E3-4754-4932-B865-424A44E58FD0}.Release Static|x64.ActiveCfg = Release|x64
+		{DB2CC2E3-4754-4932-B865-424A44E58FD0}.Release Static|x64.Build.0 = Release|x64
 		{DB2CC2E3-4754-4932-B865-424A44E58FD0}.Release|Win32.ActiveCfg = Release|Win32
 		{DB2CC2E3-4754-4932-B865-424A44E58FD0}.Release|Win32.Build.0 = Release|Win32
 		{DB2CC2E3-4754-4932-B865-424A44E58FD0}.Release|x64.ActiveCfg = Release|x64
 		{DB2CC2E3-4754-4932-B865-424A44E58FD0}.Release|x64.Build.0 = Release|x64
+		{E6B0012F-58F6-42F4-8F02-065C35829569}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{E6B0012F-58F6-42F4-8F02-065C35829569}.Debug Static|x64.ActiveCfg = Debug|x64
+		{E6B0012F-58F6-42F4-8F02-065C35829569}.Debug Static|x64.Build.0 = Debug|x64
 		{E6B0012F-58F6-42F4-8F02-065C35829569}.Debug|Win32.ActiveCfg = Debug|Win32
 		{E6B0012F-58F6-42F4-8F02-065C35829569}.Debug|Win32.Build.0 = Debug|Win32
 		{E6B0012F-58F6-42F4-8F02-065C35829569}.Debug|x64.ActiveCfg = Debug|x64
 		{E6B0012F-58F6-42F4-8F02-065C35829569}.Debug|x64.Build.0 = Debug|x64
+		{E6B0012F-58F6-42F4-8F02-065C35829569}.Release Static|Win32.ActiveCfg = Release|x64
+		{E6B0012F-58F6-42F4-8F02-065C35829569}.Release Static|x64.ActiveCfg = Release|x64
+		{E6B0012F-58F6-42F4-8F02-065C35829569}.Release Static|x64.Build.0 = Release|x64
 		{E6B0012F-58F6-42F4-8F02-065C35829569}.Release|Win32.ActiveCfg = Release|Win32
 		{E6B0012F-58F6-42F4-8F02-065C35829569}.Release|Win32.Build.0 = Release|Win32
 		{E6B0012F-58F6-42F4-8F02-065C35829569}.Release|x64.ActiveCfg = Release|x64
 		{E6B0012F-58F6-42F4-8F02-065C35829569}.Release|x64.Build.0 = Release|x64
+		{8D947123-A12C-45DA-BD00-8B62DD5A0459}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{8D947123-A12C-45DA-BD00-8B62DD5A0459}.Debug Static|x64.ActiveCfg = Debug|x64
+		{8D947123-A12C-45DA-BD00-8B62DD5A0459}.Debug Static|x64.Build.0 = Debug|x64
 		{8D947123-A12C-45DA-BD00-8B62DD5A0459}.Debug|Win32.ActiveCfg = Debug|Win32
 		{8D947123-A12C-45DA-BD00-8B62DD5A0459}.Debug|Win32.Build.0 = Debug|Win32
 		{8D947123-A12C-45DA-BD00-8B62DD5A0459}.Debug|x64.ActiveCfg = Debug|x64
 		{8D947123-A12C-45DA-BD00-8B62DD5A0459}.Debug|x64.Build.0 = Debug|x64
+		{8D947123-A12C-45DA-BD00-8B62DD5A0459}.Release Static|Win32.ActiveCfg = Release|x64
+		{8D947123-A12C-45DA-BD00-8B62DD5A0459}.Release Static|x64.ActiveCfg = Release|x64
+		{8D947123-A12C-45DA-BD00-8B62DD5A0459}.Release Static|x64.Build.0 = Release|x64
 		{8D947123-A12C-45DA-BD00-8B62DD5A0459}.Release|Win32.ActiveCfg = Release|Win32
 		{8D947123-A12C-45DA-BD00-8B62DD5A0459}.Release|Win32.Build.0 = Release|Win32
 		{8D947123-A12C-45DA-BD00-8B62DD5A0459}.Release|x64.ActiveCfg = Release|x64
 		{8D947123-A12C-45DA-BD00-8B62DD5A0459}.Release|x64.Build.0 = Release|x64
+		{8F654896-85DC-4F32-99B2-670D66B0FBF1}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{8F654896-85DC-4F32-99B2-670D66B0FBF1}.Debug Static|x64.ActiveCfg = Debug|x64
+		{8F654896-85DC-4F32-99B2-670D66B0FBF1}.Debug Static|x64.Build.0 = Debug|x64
 		{8F654896-85DC-4F32-99B2-670D66B0FBF1}.Debug|Win32.ActiveCfg = Debug|Win32
 		{8F654896-85DC-4F32-99B2-670D66B0FBF1}.Debug|Win32.Build.0 = Debug|Win32
 		{8F654896-85DC-4F32-99B2-670D66B0FBF1}.Debug|x64.ActiveCfg = Debug|x64
 		{8F654896-85DC-4F32-99B2-670D66B0FBF1}.Debug|x64.Build.0 = Debug|x64
+		{8F654896-85DC-4F32-99B2-670D66B0FBF1}.Release Static|Win32.ActiveCfg = Release|x64
+		{8F654896-85DC-4F32-99B2-670D66B0FBF1}.Release Static|x64.ActiveCfg = Release|x64
+		{8F654896-85DC-4F32-99B2-670D66B0FBF1}.Release Static|x64.Build.0 = Release|x64
 		{8F654896-85DC-4F32-99B2-670D66B0FBF1}.Release|Win32.ActiveCfg = Release|Win32
 		{8F654896-85DC-4F32-99B2-670D66B0FBF1}.Release|Win32.Build.0 = Release|Win32
 		{8F654896-85DC-4F32-99B2-670D66B0FBF1}.Release|x64.ActiveCfg = Release|x64
 		{8F654896-85DC-4F32-99B2-670D66B0FBF1}.Release|x64.Build.0 = Release|x64
+		{A4F7F6B2-0E74-4DFD-B283-C7E380BD6F58}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{A4F7F6B2-0E74-4DFD-B283-C7E380BD6F58}.Debug Static|x64.ActiveCfg = Debug|x64
+		{A4F7F6B2-0E74-4DFD-B283-C7E380BD6F58}.Debug Static|x64.Build.0 = Debug|x64
 		{A4F7F6B2-0E74-4DFD-B283-C7E380BD6F58}.Debug|Win32.ActiveCfg = Debug|Win32
 		{A4F7F6B2-0E74-4DFD-B283-C7E380BD6F58}.Debug|Win32.Build.0 = Debug|Win32
 		{A4F7F6B2-0E74-4DFD-B283-C7E380BD6F58}.Debug|x64.ActiveCfg = Debug|x64
 		{A4F7F6B2-0E74-4DFD-B283-C7E380BD6F58}.Debug|x64.Build.0 = Debug|x64
+		{A4F7F6B2-0E74-4DFD-B283-C7E380BD6F58}.Release Static|Win32.ActiveCfg = Release|x64
+		{A4F7F6B2-0E74-4DFD-B283-C7E380BD6F58}.Release Static|x64.ActiveCfg = Release|x64
+		{A4F7F6B2-0E74-4DFD-B283-C7E380BD6F58}.Release Static|x64.Build.0 = Release|x64
 		{A4F7F6B2-0E74-4DFD-B283-C7E380BD6F58}.Release|Win32.ActiveCfg = Release|Win32
 		{A4F7F6B2-0E74-4DFD-B283-C7E380BD6F58}.Release|Win32.Build.0 = Release|Win32
 		{A4F7F6B2-0E74-4DFD-B283-C7E380BD6F58}.Release|x64.ActiveCfg = Release|x64
 		{A4F7F6B2-0E74-4DFD-B283-C7E380BD6F58}.Release|x64.Build.0 = Release|x64
+		{ADBF25E2-C629-4832-B315-F12ABDE05632}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{ADBF25E2-C629-4832-B315-F12ABDE05632}.Debug Static|x64.ActiveCfg = Debug|x64
+		{ADBF25E2-C629-4832-B315-F12ABDE05632}.Debug Static|x64.Build.0 = Debug|x64
 		{ADBF25E2-C629-4832-B315-F12ABDE05632}.Debug|Win32.ActiveCfg = Debug|Win32
 		{ADBF25E2-C629-4832-B315-F12ABDE05632}.Debug|Win32.Build.0 = Debug|Win32
 		{ADBF25E2-C629-4832-B315-F12ABDE05632}.Debug|x64.ActiveCfg = Debug|x64
 		{ADBF25E2-C629-4832-B315-F12ABDE05632}.Debug|x64.Build.0 = Debug|x64
+		{ADBF25E2-C629-4832-B315-F12ABDE05632}.Release Static|Win32.ActiveCfg = Release|x64
+		{ADBF25E2-C629-4832-B315-F12ABDE05632}.Release Static|x64.ActiveCfg = Release|x64
+		{ADBF25E2-C629-4832-B315-F12ABDE05632}.Release Static|x64.Build.0 = Release|x64
 		{ADBF25E2-C629-4832-B315-F12ABDE05632}.Release|Win32.ActiveCfg = Release|Win32
 		{ADBF25E2-C629-4832-B315-F12ABDE05632}.Release|Win32.Build.0 = Release|Win32
 		{ADBF25E2-C629-4832-B315-F12ABDE05632}.Release|x64.ActiveCfg = Release|x64
 		{ADBF25E2-C629-4832-B315-F12ABDE05632}.Release|x64.Build.0 = Release|x64
+		{B50806B2-0E74-4DFD-B283-C7E380BD6F58}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{B50806B2-0E74-4DFD-B283-C7E380BD6F58}.Debug Static|x64.ActiveCfg = Debug|x64
+		{B50806B2-0E74-4DFD-B283-C7E380BD6F58}.Debug Static|x64.Build.0 = Debug|x64
 		{B50806B2-0E74-4DFD-B283-C7E380BD6F58}.Debug|Win32.ActiveCfg = Debug|Win32
 		{B50806B2-0E74-4DFD-B283-C7E380BD6F58}.Debug|Win32.Build.0 = Debug|Win32
 		{B50806B2-0E74-4DFD-B283-C7E380BD6F58}.Debug|x64.ActiveCfg = Debug|x64
 		{B50806B2-0E74-4DFD-B283-C7E380BD6F58}.Debug|x64.Build.0 = Debug|x64
+		{B50806B2-0E74-4DFD-B283-C7E380BD6F58}.Release Static|Win32.ActiveCfg = Release|x64
+		{B50806B2-0E74-4DFD-B283-C7E380BD6F58}.Release Static|x64.ActiveCfg = Release|x64
+		{B50806B2-0E74-4DFD-B283-C7E380BD6F58}.Release Static|x64.Build.0 = Release|x64
 		{B50806B2-0E74-4DFD-B283-C7E380BD6F58}.Release|Win32.ActiveCfg = Release|Win32
 		{B50806B2-0E74-4DFD-B283-C7E380BD6F58}.Release|Win32.Build.0 = Release|Win32
 		{B50806B2-0E74-4DFD-B283-C7E380BD6F58}.Release|x64.ActiveCfg = Release|x64
 		{B50806B2-0E74-4DFD-B283-C7E380BD6F58}.Release|x64.Build.0 = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C22}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C22}.Debug Static|x64.ActiveCfg = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C22}.Debug Static|x64.Build.0 = Debug|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C22}.Debug|Win32.ActiveCfg = Debug|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C22}.Debug|Win32.Build.0 = Debug|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C22}.Debug|x64.ActiveCfg = Debug|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C22}.Debug|x64.Build.0 = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C22}.Release Static|Win32.ActiveCfg = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C22}.Release Static|x64.ActiveCfg = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C22}.Release Static|x64.Build.0 = Release|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C22}.Release|Win32.ActiveCfg = Release|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C22}.Release|Win32.Build.0 = Release|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C22}.Release|x64.ActiveCfg = Release|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C22}.Release|x64.Build.0 = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1D}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1D}.Debug Static|x64.ActiveCfg = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1D}.Debug Static|x64.Build.0 = Debug|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1D}.Debug|Win32.ActiveCfg = Debug|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1D}.Debug|Win32.Build.0 = Debug|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1D}.Debug|x64.ActiveCfg = Debug|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1D}.Debug|x64.Build.0 = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1D}.Release Static|Win32.ActiveCfg = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1D}.Release Static|x64.ActiveCfg = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1D}.Release Static|x64.Build.0 = Release|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1D}.Release|Win32.ActiveCfg = Release|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1D}.Release|Win32.Build.0 = Release|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1D}.Release|x64.ActiveCfg = Release|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1D}.Release|x64.Build.0 = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1E}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1E}.Debug Static|x64.ActiveCfg = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1E}.Debug Static|x64.Build.0 = Debug|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1E}.Debug|Win32.ActiveCfg = Debug|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1E}.Debug|Win32.Build.0 = Debug|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1E}.Debug|x64.ActiveCfg = Debug|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1E}.Debug|x64.Build.0 = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1E}.Release Static|Win32.ActiveCfg = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1E}.Release Static|x64.ActiveCfg = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1E}.Release Static|x64.Build.0 = Release|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1E}.Release|Win32.ActiveCfg = Release|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1E}.Release|Win32.Build.0 = Release|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1E}.Release|x64.ActiveCfg = Release|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1E}.Release|x64.Build.0 = Release|x64
+		{FBC27460-155E-4C13-AFDF-BA8B7BE28F7F}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{FBC27460-155E-4C13-AFDF-BA8B7BE28F7F}.Debug Static|x64.ActiveCfg = Debug|x64
+		{FBC27460-155E-4C13-AFDF-BA8B7BE28F7F}.Debug Static|x64.Build.0 = Debug|x64
 		{FBC27460-155E-4C13-AFDF-BA8B7BE28F7F}.Debug|Win32.ActiveCfg = Debug|Win32
 		{FBC27460-155E-4C13-AFDF-BA8B7BE28F7F}.Debug|Win32.Build.0 = Debug|Win32
 		{FBC27460-155E-4C13-AFDF-BA8B7BE28F7F}.Debug|x64.ActiveCfg = Debug|x64
 		{FBC27460-155E-4C13-AFDF-BA8B7BE28F7F}.Debug|x64.Build.0 = Debug|x64
+		{FBC27460-155E-4C13-AFDF-BA8B7BE28F7F}.Release Static|Win32.ActiveCfg = Release|x64
+		{FBC27460-155E-4C13-AFDF-BA8B7BE28F7F}.Release Static|x64.ActiveCfg = Release|x64
+		{FBC27460-155E-4C13-AFDF-BA8B7BE28F7F}.Release Static|x64.Build.0 = Release|x64
 		{FBC27460-155E-4C13-AFDF-BA8B7BE28F7F}.Release|Win32.ActiveCfg = Release|Win32
 		{FBC27460-155E-4C13-AFDF-BA8B7BE28F7F}.Release|Win32.Build.0 = Release|Win32
 		{FBC27460-155E-4C13-AFDF-BA8B7BE28F7F}.Release|x64.ActiveCfg = Release|x64
 		{FBC27460-155E-4C13-AFDF-BA8B7BE28F7F}.Release|x64.Build.0 = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1F}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1F}.Debug Static|x64.ActiveCfg = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1F}.Debug Static|x64.Build.0 = Debug|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1F}.Debug|Win32.ActiveCfg = Debug|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1F}.Debug|Win32.Build.0 = Debug|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1F}.Debug|x64.ActiveCfg = Debug|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1F}.Debug|x64.Build.0 = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1F}.Release Static|Win32.ActiveCfg = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1F}.Release Static|x64.ActiveCfg = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1F}.Release Static|x64.Build.0 = Release|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1F}.Release|Win32.ActiveCfg = Release|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1F}.Release|Win32.Build.0 = Release|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1F}.Release|x64.ActiveCfg = Release|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C1F}.Release|x64.Build.0 = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C20}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C20}.Debug Static|x64.ActiveCfg = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C20}.Debug Static|x64.Build.0 = Debug|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C20}.Debug|Win32.ActiveCfg = Debug|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C20}.Debug|Win32.Build.0 = Debug|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C20}.Debug|x64.ActiveCfg = Debug|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C20}.Debug|x64.Build.0 = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C20}.Release Static|Win32.ActiveCfg = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C20}.Release Static|x64.ActiveCfg = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C20}.Release Static|x64.Build.0 = Release|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C20}.Release|Win32.ActiveCfg = Release|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C20}.Release|Win32.Build.0 = Release|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C20}.Release|x64.ActiveCfg = Release|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C20}.Release|x64.Build.0 = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C21}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C21}.Debug Static|x64.ActiveCfg = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C21}.Debug Static|x64.Build.0 = Debug|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C21}.Debug|Win32.ActiveCfg = Debug|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C21}.Debug|Win32.Build.0 = Debug|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C21}.Debug|x64.ActiveCfg = Debug|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C21}.Debug|x64.Build.0 = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C21}.Release Static|Win32.ActiveCfg = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C21}.Release Static|x64.ActiveCfg = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C21}.Release Static|x64.Build.0 = Release|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C21}.Release|Win32.ActiveCfg = Release|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C21}.Release|Win32.Build.0 = Release|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C21}.Release|x64.ActiveCfg = Release|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C21}.Release|x64.Build.0 = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C23}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C23}.Debug Static|x64.ActiveCfg = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C23}.Debug Static|x64.Build.0 = Debug|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C23}.Debug|Win32.ActiveCfg = Debug|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C23}.Debug|Win32.Build.0 = Debug|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C23}.Debug|x64.ActiveCfg = Debug|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C23}.Debug|x64.Build.0 = Debug|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C23}.Release Static|Win32.ActiveCfg = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C23}.Release Static|x64.ActiveCfg = Release|x64
+		{561F38EE-E22F-481A-8EFB-DC0AA25B4C23}.Release Static|x64.Build.0 = Release|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C23}.Release|Win32.ActiveCfg = Release|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C23}.Release|Win32.Build.0 = Release|Win32
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C23}.Release|x64.ActiveCfg = Release|x64
 		{561F38EE-E22F-481A-8EFB-DC0AA25B4C23}.Release|x64.Build.0 = Release|x64
+		{42491401-B624-440D-91D7-1F2633EFB4E3}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{42491401-B624-440D-91D7-1F2633EFB4E3}.Debug Static|x64.ActiveCfg = Debug|x64
+		{42491401-B624-440D-91D7-1F2633EFB4E3}.Debug Static|x64.Build.0 = Debug|x64
 		{42491401-B624-440D-91D7-1F2633EFB4E3}.Debug|Win32.ActiveCfg = Debug|Win32
 		{42491401-B624-440D-91D7-1F2633EFB4E3}.Debug|Win32.Build.0 = Debug|Win32
 		{42491401-B624-440D-91D7-1F2633EFB4E3}.Debug|x64.ActiveCfg = Debug|x64
 		{42491401-B624-440D-91D7-1F2633EFB4E3}.Debug|x64.Build.0 = Debug|x64
+		{42491401-B624-440D-91D7-1F2633EFB4E3}.Release Static|Win32.ActiveCfg = Release|x64
+		{42491401-B624-440D-91D7-1F2633EFB4E3}.Release Static|x64.ActiveCfg = Release|x64
+		{42491401-B624-440D-91D7-1F2633EFB4E3}.Release Static|x64.Build.0 = Release|x64
 		{42491401-B624-440D-91D7-1F2633EFB4E3}.Release|Win32.ActiveCfg = Release|Win32
 		{42491401-B624-440D-91D7-1F2633EFB4E3}.Release|Win32.Build.0 = Release|Win32
 		{42491401-B624-440D-91D7-1F2633EFB4E3}.Release|x64.ActiveCfg = Release|x64
 		{42491401-B624-440D-91D7-1F2633EFB4E3}.Release|x64.Build.0 = Release|x64
+		{DD0284A0-1ECE-4387-AED3-E9BF5EE74FF8}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{DD0284A0-1ECE-4387-AED3-E9BF5EE74FF8}.Debug Static|x64.ActiveCfg = Debug|x64
+		{DD0284A0-1ECE-4387-AED3-E9BF5EE74FF8}.Debug Static|x64.Build.0 = Debug|x64
 		{DD0284A0-1ECE-4387-AED3-E9BF5EE74FF8}.Debug|Win32.ActiveCfg = Debug|Win32
 		{DD0284A0-1ECE-4387-AED3-E9BF5EE74FF8}.Debug|Win32.Build.0 = Debug|Win32
 		{DD0284A0-1ECE-4387-AED3-E9BF5EE74FF8}.Debug|x64.ActiveCfg = Debug|x64
 		{DD0284A0-1ECE-4387-AED3-E9BF5EE74FF8}.Debug|x64.Build.0 = Debug|x64
+		{DD0284A0-1ECE-4387-AED3-E9BF5EE74FF8}.Release Static|Win32.ActiveCfg = Release|x64
+		{DD0284A0-1ECE-4387-AED3-E9BF5EE74FF8}.Release Static|x64.ActiveCfg = Release|x64
+		{DD0284A0-1ECE-4387-AED3-E9BF5EE74FF8}.Release Static|x64.Build.0 = Release|x64
 		{DD0284A0-1ECE-4387-AED3-E9BF5EE74FF8}.Release|Win32.ActiveCfg = Release|Win32
 		{DD0284A0-1ECE-4387-AED3-E9BF5EE74FF8}.Release|Win32.Build.0 = Release|Win32
 		{DD0284A0-1ECE-4387-AED3-E9BF5EE74FF8}.Release|x64.ActiveCfg = Release|x64
 		{DD0284A0-1ECE-4387-AED3-E9BF5EE74FF8}.Release|x64.Build.0 = Release|x64
+		{F486B768-640A-445D-8C09-437C896EFFAD}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{F486B768-640A-445D-8C09-437C896EFFAD}.Debug Static|x64.ActiveCfg = Debug|x64
+		{F486B768-640A-445D-8C09-437C896EFFAD}.Debug Static|x64.Build.0 = Debug|x64
 		{F486B768-640A-445D-8C09-437C896EFFAD}.Debug|Win32.ActiveCfg = Debug|Win32
 		{F486B768-640A-445D-8C09-437C896EFFAD}.Debug|Win32.Build.0 = Debug|Win32
 		{F486B768-640A-445D-8C09-437C896EFFAD}.Debug|x64.ActiveCfg = Debug|x64
 		{F486B768-640A-445D-8C09-437C896EFFAD}.Debug|x64.Build.0 = Debug|x64
+		{F486B768-640A-445D-8C09-437C896EFFAD}.Release Static|Win32.ActiveCfg = Release|x64
+		{F486B768-640A-445D-8C09-437C896EFFAD}.Release Static|x64.ActiveCfg = Release|x64
+		{F486B768-640A-445D-8C09-437C896EFFAD}.Release Static|x64.Build.0 = Release|x64
 		{F486B768-640A-445D-8C09-437C896EFFAD}.Release|Win32.ActiveCfg = Release|Win32
 		{F486B768-640A-445D-8C09-437C896EFFAD}.Release|Win32.Build.0 = Release|Win32
 		{F486B768-640A-445D-8C09-437C896EFFAD}.Release|x64.ActiveCfg = Release|x64
 		{F486B768-640A-445D-8C09-437C896EFFAD}.Release|x64.Build.0 = Release|x64
+		{531778C6-C340-40F2-B403-9B58B8121AAB}.Debug Static|Win32.ActiveCfg = Debug|x64
+		{531778C6-C340-40F2-B403-9B58B8121AAB}.Debug Static|x64.ActiveCfg = Debug|x64
+		{531778C6-C340-40F2-B403-9B58B8121AAB}.Debug Static|x64.Build.0 = Debug|x64
 		{531778C6-C340-40F2-B403-9B58B8121AAB}.Debug|Win32.ActiveCfg = Debug|Win32
 		{531778C6-C340-40F2-B403-9B58B8121AAB}.Debug|Win32.Build.0 = Debug|Win32
 		{531778C6-C340-40F2-B403-9B58B8121AAB}.Debug|x64.ActiveCfg = Debug|x64
 		{531778C6-C340-40F2-B403-9B58B8121AAB}.Debug|x64.Build.0 = Debug|x64
+		{531778C6-C340-40F2-B403-9B58B8121AAB}.Release Static|Win32.ActiveCfg = Release|x64
+		{531778C6-C340-40F2-B403-9B58B8121AAB}.Release Static|x64.ActiveCfg = Release|x64
+		{531778C6-C340-40F2-B403-9B58B8121AAB}.Release Static|x64.Build.0 = Release|x64
 		{531778C6-C340-40F2-B403-9B58B8121AAB}.Release|Win32.ActiveCfg = Release|Win32
 		{531778C6-C340-40F2-B403-9B58B8121AAB}.Release|Win32.Build.0 = Release|Win32
 		{531778C6-C340-40F2-B403-9B58B8121AAB}.Release|x64.ActiveCfg = Release|x64

Modified: sandbox/rfc90/MgDev/Server/src/Core/serverconfig.ini
===================================================================
--- trunk/MgDev/Server/src/Core/serverconfig.ini	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Server/src/Core/serverconfig.ini	2010-03-26 03:01:23 UTC (rev 4700)
@@ -365,8 +365,10 @@
 #                                  are stored
 # SiteRepositoryPath               Path where the Site repository is stored
 # *****************************************************************************
-LibraryRepositoryPath              = Repositories/Library/
-LibraryResourceDataFilePath        = Repositories/Library/DataFiles/
+#LibraryRepositoryPath              = Repositories/Library/
+#LibraryResourceDataFilePath        = Repositories/Library/DataFiles/
+LibraryRepositoryPath              = C:\Program Files\MapGuideOpenSource2.0\Server\Repositories\BigLibrary\
+LibraryResourceDataFilePath        = C:\Program Files\MapGuideOpenSource2.0\Server\Repositories\BigLibrary\DataFiles\
 PackagesPath                       = Packages/
 RepositoryCheckpointsTimerInterval = 600
 ResourceChangeTimerInterval        = 5
@@ -412,8 +414,13 @@
 #                                       50 < value <= 10000
 # ImageFormat                      Image format for generated tiles
 #                                       PNG, PNG8, GIF or JPG
+# PollingInterval									 sleep in milliseconds before rechecking the lockfile
+# CreationCutoffTime							 seconds after which abort the lockfile test
 # *****************************************************************************
-RenderOnly                         = 0
+RenderOnly                         = 1
+PollingInterval                    = 500
+CreationCutoffTime                 = 120
+UseMetaTiles                       = 0
 TileCachePath                      = Repositories/TileCache/
 TileColumnsPerFolder               = 30
 TileRowsPerFolder                  = 30

Modified: sandbox/rfc90/MgDev/Server/src/PostBuild/PostBuild.mak
===================================================================
--- trunk/MgDev/Server/src/PostBuild/PostBuild.mak	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Server/src/PostBuild/PostBuild.mak	2010-03-26 03:01:23 UTC (rev 4700)
@@ -93,7 +93,7 @@
 
 CopyFdoComponentsDebug : ..\..\..\Oem\FDO\*.*
     if NOT EXIST ..\..\bin\debug\FDO\nul mkdir ..\..\bin\debug\FDO
-    xcopy /r /d /y /s ..\..\..\Oem\FDO\bin\Release ..\..\bin\debug\FDO\
+    xcopy /r /d /y /s ..\..\..\Oem\FDO\bin ..\..\bin\debug\FDO\
 
 CopyFdoProvidersDebug : ..\..\..\Oem\FDO\ProviderList\ServerCommunity\providers.xml
     xcopy /r /d /y "..\..\..\Oem\FDO\ProviderList\ServerCommunity\providers.xml" ..\..\bin\debug\FDO\

Modified: sandbox/rfc90/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp
===================================================================
--- trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp	2010-03-26 03:01:23 UTC (rev 4700)
@@ -36,6 +36,8 @@
 static const INT32 FILTER_SELECTABLE = 2;
 static const INT32 FILTER_HASTOOLTIPS = 4;
 
+INT32 MgServerRenderingService::sm_useMetaTiles = 0;     // 0 = no metatiling
+
 inline bool hasColorMap (STRING format)
 {
     return format == L"PNG8" || format == L"GIF";
@@ -116,6 +118,13 @@
                           MgConfigProperties::DefaultRenderingServicePropertyGeneralizeData);
     AGGRenderer::s_bGeneralizeData = bGeneralizeData;
     GDRenderer::s_bGeneralizeData = bGeneralizeData;
+
+    pConf->GetIntValue(
+    MgConfigProperties::TileServicePropertiesSection,
+    MgConfigProperties::TileServicePropertyUseMetaTiles,
+    sm_useMetaTiles,
+    MgConfigProperties::DefaultTileServicePropertyUseMetaTiles);
+
 }
 
 
@@ -124,7 +133,30 @@
 {
 }
 
+///////////////////////////////////////////////////////////////////////////////
+void MgServerRenderingService::GetTileCoords(MgMap* map, int tileColOffset, int tileColumn, int tileRow,
+    double &tileMinX, double &tileMaxX , double &tileMinY ,double & tileMaxY)
+{
+    Ptr<MgEnvelope> mapExtent = map->GetMapExtent();
+    Ptr<MgCoordinate> pt00 = mapExtent->GetLowerLeftCoordinate();
+    Ptr<MgCoordinate> pt11 = mapExtent->GetUpperRightCoordinate();
+    double mapMinX = rs_min(pt00->GetX(), pt11->GetX());
+    double mapMaxX = rs_max(pt00->GetX(), pt11->GetX());
+    double mapMinY = rs_min(pt00->GetY(), pt11->GetY());
+    double mapMaxY = rs_max(pt00->GetY(), pt11->GetY());
 
+    double scale = map->GetViewScale();
+    double metersPerUnit  = map->GetMetersPerUnit();
+    double metersPerPixel = METERS_PER_INCH / MgTileParameters::tileDPI;
+    double tileWidthMCS   = (double)MgTileParameters::tileWidth  * metersPerPixel * scale / metersPerUnit;
+    double tileHeightMCS  = (double)MgTileParameters::tileHeight * metersPerPixel * scale / metersPerUnit;
+
+    tileMinX = mapMinX + (double)(tileColumn  ) * tileWidthMCS;  // left edge
+    tileMaxX = mapMinX + (double)(tileColumn+ tileColOffset) * tileWidthMCS;  // right edge
+    tileMinY = mapMaxY - (double)(tileRow   + tileColOffset) * tileHeightMCS; // bottom edge
+    tileMaxY = mapMaxY - (double)(tileRow     ) * tileHeightMCS; // top edge
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 MgByteReader* MgServerRenderingService::RenderTile(MgMap* map,
                                                    CREFSTRING baseMapLayerGroupName,
@@ -170,27 +202,19 @@
     // upper left corner of the map extent
     // ------------------------------------------------------
 
-    Ptr<MgEnvelope> mapExtent = map->GetMapExtent();
-    Ptr<MgCoordinate> pt00 = mapExtent->GetLowerLeftCoordinate();
-    Ptr<MgCoordinate> pt11 = mapExtent->GetUpperRightCoordinate();
-    double mapMinX = rs_min(pt00->GetX(), pt11->GetX());
-    double mapMaxX = rs_max(pt00->GetX(), pt11->GetX());
-    double mapMinY = rs_min(pt00->GetY(), pt11->GetY());
-    double mapMaxY = rs_max(pt00->GetY(), pt11->GetY());
+    double tileMinX,tileMaxX ,tileMinY ,tileMaxY;
+    if (sm_useMetaTiles)
+        GetTileCoords(map, sm_useMetaTiles, tileColumn, tileRow, tileMinX,tileMaxX ,tileMinY ,tileMaxY);
+    else
+        GetTileCoords(map, 1, tileColumn, tileRow, tileMinX,tileMaxX ,tileMinY ,tileMaxY); // zero and 1 is the same logically
 
-    double metersPerUnit  = map->GetMetersPerUnit();
-    double metersPerPixel = METERS_PER_INCH / MgTileParameters::tileDPI;
-    double tileWidthMCS   = (double)MgTileParameters::tileWidth  * metersPerPixel * scale / metersPerUnit;
-    double tileHeightMCS  = (double)MgTileParameters::tileHeight * metersPerPixel * scale / metersPerUnit;
-
-    double tileMinX = mapMinX + (double)(tileColumn  ) * tileWidthMCS;  // left edge
-    double tileMaxX = mapMinX + (double)(tileColumn+1) * tileWidthMCS;  // right edge
-    double tileMinY = mapMaxY - (double)(tileRow   +1) * tileHeightMCS; // bottom edge
-    double tileMaxY = mapMaxY - (double)(tileRow     ) * tileHeightMCS; // top edge
-
+    // METATILING dont forget to increase the bitmap for the larger tile and set the format
+    int metaFactor = sm_useMetaTiles?sm_useMetaTiles:1;
     // make the call to render the tile
-    ret = RenderTile(map, baseGroup, scaleIndex, MgTileParameters::tileWidth, MgTileParameters::tileHeight, scale,
-                     tileMinX, tileMaxX, tileMinY, tileMaxY, MgTileParameters::tileFormat);
+    ret = RenderTile(map, baseGroup, scaleIndex, MgTileParameters::tileWidth * metaFactor, 
+                                                 MgTileParameters::tileHeight * metaFactor, 
+                                                 scale, tileMinX, tileMaxX, tileMinY, tileMaxY, 
+                                                 sm_useMetaTiles?L"META":MgTileParameters::tileFormat);
 
     MG_CATCH_AND_THROW(L"MgServerRenderingService.RenderTile")
 
@@ -266,8 +290,67 @@
 
     return ret.Detach();
 }
+///////////////////////////////////////////////////////////////////////////////
+// gets called with a bitmap in the bytereader to be plit up into 4 images
+MgByteReader* MgServerRenderingService::RenderTileFromMetaTile(MgMap* map, MgByteReader* metaTile, 
+                                                           int subTileX, int subTileY)
+{
+    MgByteSource* bs = metaTile->GetByteSource();
+    ByteSourceImpl* bsimp = bs->GetSourceImpl();
+    assert (bs->GetMimeType() == L"META");
+    int size = (int) bsimp->GetLength();
+    class MyByteSource {
+    public:
+        virtual ~MyByteSource() {} ;        // needed to get the correct sizeof for object
+        MgByte* Bytes() { return m_data; }
+        Ptr<MgByte> m_data;
+        INT32   m_pos;
+    } *source = (MyByteSource *) bsimp;
 
+    // some checking: the complete meta tile should be in the framebuffer handed over
+    int expectedSize = 4 * (sm_useMetaTiles * MgTileParameters::tileWidth) * (sm_useMetaTiles * MgTileParameters::tileHeight);
+    assert(size == expectedSize);
 
+    MgByte* byteBuffer = source->Bytes();
+    unsigned char* byteBuf = byteBuffer->Bytes();
+    assert(size == byteBuffer->GetLength());            // double check the buffers
+
+    // use the map's background color, but always make it fully transparent
+    RS_Color bgColor;
+    StylizationUtil::ParseColor(map->GetBackgroundColor(), bgColor);
+    bgColor.alpha() = 0;    
+    auto_ptr<SE_Renderer> dr(CreateRenderer(MgTileParameters::tileWidth,MgTileParameters::tileHeight, bgColor, true));
+    RS_ColorVector tileColorPalette;
+    if (m_rendererName == L"AGG" && hasColorMap(MgTileParameters::tileFormat))
+    {
+        MgMappingUtil::ParseColorStrings(&tileColorPalette, map);
+    }
+
+    // copy tile from meta framebuffer to new one...
+    // use unsigned int pointer arithmetic for pixels!
+
+    // get pointer to metatile framebuf
+    unsigned int *framebuf = (unsigned int*) byteBuf; 
+
+    // allocate subtile buffer to copy new framebuf with changed dimensions
+    // place buffer in None allocated MgByte auto_ptr object for later destruction
+    auto_ptr<MgByte> subTileBytes (new MgByte((unsigned char*)new unsigned int[MgTileParameters::tileWidth * MgTileParameters::tileHeight],
+                                                MgTileParameters::tileWidth * MgTileParameters::tileHeight * sizeof(int) , MgByte::New));
+    // get the pointer to the internal target buffer
+    unsigned int* subTileBuf = (unsigned int*) subTileBytes->Bytes();    
+    for (int y=0; y < MgTileParameters::tileHeight; y++)    // rows
+      for (int x=0; x < MgTileParameters::tileWidth; x++)    // columns innerloop
+     {
+         *(subTileBuf   + x 
+                        + y * MgTileParameters::tileWidth)                 // target address in small tile
+             = *(framebuf + (x + (subTileX * MgTileParameters::tileWidth))   // X address in meta tile
+                          + (y + (subTileY * MgTileParameters::tileHeight)) 
+                             * MgTileParameters::tileWidth * sm_useMetaTiles);  // use width of metaTile here
+     }
+    // we need to pass the optional colortable param to satisfy the overloaded call
+    return SaveBitmap(map, dr.get(), MgTileParameters::tileWidth,MgTileParameters::tileHeight,MgTileParameters::tileFormat, subTileBuf);
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 // default arg bKeepSelection = true
 MgByteReader* MgServerRenderingService::RenderDynamicOverlay(MgMap* map,
@@ -951,6 +1034,18 @@
     dr->ProcessPolyline(&lb, ls);
     //-------------------------------------------------------
 */
+    return SaveBitmap(map, dr, saveWidth, saveHeight, format);
+}
+///////////////////////////////////////////////////////////////////////////////
+/// take the framebuffer/bitmap after rendering - another method extraction
+/// and turn it into the image of given format
+MgByteReader* MgServerRenderingService::SaveBitmap(MgMap* map,
+                                                   SE_Renderer* dr,
+                                                   INT32 saveWidth,
+                                                   INT32 saveHeight,
+                                                   CREFSTRING format,
+                                                   unsigned int* framebuf)
+{
     Ptr<MgByteReader> ret;
 
     // get a byte representation of the image
@@ -958,38 +1053,44 @@
 
     try
     {
-        // call the image renderer to create the image
-        if (wcscmp(m_rendererName.c_str(), L"AGG") == 0)
+        // call the image renderer to create the image from the bitmap
+        if (m_rendererName == L"AGG") // AGG or GD (obsolete?)
         {
-            //-------------------------------------------------------
-            /// RFC60 code to correct colormaps by UV
-            //-------------------------------------------------------
-            // We examine the expressions collected from xml definitions of all layers.
-            // The map object has a list from all color entries found in the most recent
-            // layer stylization.
-            // * TODO - currently they are interpreted as ffffffff 32-bit RGBA string values
-            // * adding expresssions and other interpretations should be done in ParseColorStrings
-            // * the color Palette for the renderer is a vector<RS_Color>
-            if (hasColorMap(format))
+            if (format == L"META")  // we dont use the colorPalette here for meta tiling
+            {                       // as this call only returns the framebuffer
+                 data.reset(((AGGRenderer*)dr)->Save(format, saveWidth, saveHeight, NULL, NULL));
+                 // copy the framebuffer into the reader TODO: find a way to pass the pointer
+            } else
             {
-                RS_ColorVector tileColorPalette;
-                MgMappingUtil::ParseColorStrings(&tileColorPalette, map);
-//              printf("<<<<<<<<<<<<<<<<<<<<< MgServerRenderingService::ColorPalette->size(): %d\n", tileColorPalette.size());
-                data.reset(((AGGRenderer*)dr)->Save(format, saveWidth, saveHeight, &tileColorPalette));
+                //-------------------------------------------------------
+                /// RFC60 code to correct colormaps by UV
+                //-------------------------------------------------------
+                // We examine the expressions collected from xml definitions of all layers.
+                // The map object has a list from all color entries found in the most recent
+                // layer stylization.
+                // * TODO - currently they are interpreted as ffffffff 32-bit RGBA string values
+                // * adding expresssions and other interpretations should be done in ParseColorStrings
+                // * the color Palette for the renderer is a vector<RS_Color>
+                if (hasColorMap(format))
+                {
+                    RS_ColorVector tileColorPalette;
+                    MgMappingUtil::ParseColorStrings(&tileColorPalette, map);
+                    data.reset(((AGGRenderer*)dr)->Save(format, saveWidth, saveHeight, &tileColorPalette, framebuf));
+                }
+                else
+                    data.reset(((AGGRenderer*)dr)->Save(format, saveWidth, saveHeight, NULL, framebuf));
             }
-            else
-                data.reset(((AGGRenderer*)dr)->Save(format, saveWidth, saveHeight, NULL));
         }
         else
-            data.reset(((GDRenderer*)dr)->Save(format, saveWidth, saveHeight));
+            data.reset(((GDRenderer*)dr)->Save(format, saveWidth, saveHeight)); // dont care with metatiling
     }
     catch (exception e)
     {
-        ACE_DEBUG((LM_DEBUG, L"(%t) %w caught in RenderingService ColorPaletteGeneration\n", e.what()));
+        ACE_DEBUG((LM_DEBUG, L"(%t) %w caught in RenderingService::SaveBitmap\n", e.what()));
         throw e;
     }
 
-    if (NULL != data.get())
+    if (NULL != data.get())             // leave it as a bitmap if metatiling    
     {
         // put this into a byte source
         Ptr<MgByteSource> bs = new MgByteSource(data->GetBytes(), data->GetNumBytes());
@@ -1002,6 +1103,8 @@
             bs->SetMimeType(MgMimeType::Png);
         else if (format == MgImageFormats::Tiff)
             bs->SetMimeType(MgMimeType::Tiff);
+        else if (format == L"META")         // add a mimetype for our metatile
+            bs->SetMimeType(format);
 
         ret = bs->GetReader();
     }
@@ -1069,7 +1172,7 @@
 
     // get a byte representation of the image
     auto_ptr<RS_ByteData> data;
-
+    
     if (wcscmp(m_rendererName.c_str(), L"AGG") == 0)
         data.reset(((AGGRenderer*)dr.get())->Save(format, width, height));
     else
@@ -1097,7 +1200,6 @@
     return ret.Detach();
 }
 
-
 ///////////////////////////////////////////////////////////////////////////////
 // A helper function that does most of the work for QueryFeatures
 // and QueryFeatureProperties.  Basically runs a rendering loop with

Modified: sandbox/rfc90/MgDev/Server/src/Services/Rendering/ServerRenderingService.h
===================================================================
--- trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.h	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Server/src/Services/Rendering/ServerRenderingService.h	2010-03-26 03:01:23 UTC (rev 4700)
@@ -41,6 +41,12 @@
                                      INT32 tileColumn,
                                      INT32 tileRow);
 
+    virtual MgByteReader* RenderTileFromMetaTile(MgMap* map,
+                                             MgByteReader* metaTile,
+                                             INT32 subTileX,
+                                             INT32 subTileY);
+
+
     virtual MgByteReader* RenderDynamicOverlay(MgMap* map,
                                                MgSelection* selection,
                                                CREFSTRING format);
@@ -149,7 +155,9 @@
                                         CREFSTRING featureFilter,
                                         INT32 maxFeatures,
                                         INT32 layerAttributeFilter);
-
+    void GetTileCoords(MgMap* map, int tileColOffset, int tileColumn, int tileRow, 
+        double &tileMinX, double &tileMaxX , double &tileMinY ,double & tileMaxY);
+    
 private:
     // used for tile generation
     MgByteReader* RenderTile(MgMap* map,
@@ -163,6 +171,13 @@
                              double mcsMinY,
                              double mcsMaxY,
                              CREFSTRING format);
+    // extracted method to save bitmap into image for reuse
+    MgByteReader* SaveBitmap(MgMap* map,
+                             SE_Renderer* dr,
+                             INT32 saveWidth,
+                             INT32 saveHeight,
+                             CREFSTRING format,
+                             unsigned int* framebuf = 0);
 
     // helper used by other methods
     MgByteReader* RenderMapInternal(MgMap* map,
@@ -217,6 +232,8 @@
     INT32 m_minRasterGridSize;
     double m_rasterGridSizeOverrideRatio;
     INT32 m_renderSelectionBatchSize;
+    static INT32 sm_useMetaTiles;
+
 };
 
 #endif

Modified: sandbox/rfc90/MgDev/Server/src/Services/Rendering/ServerRenderingService.vcproj
===================================================================
--- trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.vcproj	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Server/src/Services/Rendering/ServerRenderingService.vcproj	2010-03-26 03:01:23 UTC (rev 4700)
@@ -44,7 +44,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="..\..\Common;..\..\Common\Base;..\..\Common\Manager;..\Feature;..\Mapping;..\..\..\..\Common\Foundation;..\..\..\..\Common\Geometry;..\..\..\..\Common\PlatformBase;..\..\..\..\Common\MapGuideCommon;..\..\..\..\Common\MdfModel;..\..\..\..\Common\Renderers;..\..\..\..\Common\Stylization;..\..\..\..\Oem\ACE\ACE_wrappers;..\..\..\..\Oem\dbxml-2.3.10\xerces-c-src\src;..\..\..\..\Oem\FDO\inc;..\..\..\..\Oem\FDO\inc\ExpressionEngine"
+				AdditionalIncludeDirectories="..\..\Common;..\..\Common\Base;..\..\Common\Manager;..\Feature;..\Mapping;..\Tile;..\..\..\..\Common\Foundation;..\..\..\..\Common\Geometry;..\..\..\..\Common\PlatformBase;..\..\..\..\Common\MapGuideCommon;..\..\..\..\Common\MdfModel;..\..\..\..\Common\Renderers;..\..\..\..\Common\Stylization;..\..\..\..\Oem\ACE\ACE_wrappers;&quot;..\..\..\..\Oem\dbxml-2.3.10\xerces-c-src\src&quot;;..\..\..\..\Oem\FDO\inc;..\..\..\..\Oem\FDO\inc\ExpressionEngine"
 				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MG_SERVER_RENDERING_EXPORTS"
 				MinimalRebuild="true"
 				ExceptionHandling="2"

Modified: sandbox/rfc90/MgDev/Server/src/Services/Tile/ServerTileService.cpp
===================================================================
--- trunk/MgDev/Server/src/Services/Tile/ServerTileService.cpp	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Server/src/Services/Tile/ServerTileService.cpp	2010-03-26 03:01:23 UTC (rev 4700)
@@ -17,7 +17,8 @@
 
 #include "MapGuideCommon.h"
 #include "ServerTileService.h"
-
+#include "ServerRenderingService.h"
+#include <sstream>
 IMPLEMENT_CREATE_SERVICE(MgServerTileService)
 
 ACE_Recursive_Thread_Mutex MgServerTileService::sm_mutex;
@@ -27,6 +28,7 @@
 INT32 MgServerTileService::sm_creationCutoffTime = 120;     // in seconds
 INT32 MgServerTileService::sm_pollingInterval = 1;          // in seconds
 INT32 MgServerTileService::sm_mapCacheSize = 10;
+INT32 MgServerTileService::sm_useMetaTiles = 0;
 
 MgServerTileService::MgServerTileService() : MgTileService()
 {
@@ -63,11 +65,17 @@
                 sm_mapCacheSize,
                 MgConfigProperties::DefaultTileServicePropertyTiledMapCacheSize);
 
+            configuration->GetIntValue(
+                MgConfigProperties::TileServicePropertiesSection,
+                MgConfigProperties::TileServicePropertyUseMetaTiles,
+                sm_useMetaTiles,
+                MgConfigProperties::DefaultTileServicePropertyUseMetaTiles);
+
             MgTileCache::Initialize();
             sm_initialized = true;
         }
     }
-
+    m_resourceService = NULL;
     m_tileCache = new MgTileCache();
 }
 
@@ -105,7 +113,10 @@
 
         if (diffTime < sm_creationCutoffTime)
         {
-            ACE_OS::sleep(sm_pollingInterval);
+            // sm_pollingInterval om milliseconds
+            int sec = sm_pollingInterval/1000;
+            ACE_Time_Value polInt (sec, (sm_pollingInterval - (sec*1000))*1000);
+            ACE_OS::sleep(polInt);
         }
         else
         {
@@ -121,7 +132,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 // Create tilename from mapDefinition, scaleIndex, row, and column.
 // Remove lockfile, look for the tile in the cache, if not in cache create
-// lockfile and look for map in mapcache.
+// lockfile and look for map in mapcache. APIVERSION 1.2
 MgByteReader* MgServerTileService::GetTile(MgResourceIdentifier* mapDefinition,
                                            CREFSTRING baseMapLayerGroupName,
                                            INT32 tileColumn,
@@ -131,8 +142,14 @@
     Ptr<MgByteReader> ret;
     FILE* lockFile = NULL;
     STRING tilePathname, lockPathname;
+    // metatiling vars
+    FILE* subTileLockFile[METAMAXDIM][METAMAXDIM];
+    STRING subTileLockPathname[METAMAXDIM][METAMAXDIM], subTilePathname[METAMAXDIM][METAMAXDIM];
+    STRING metaTileLockPathname, metaTilePathname;
+    int maxX,maxY, subTileX,subTileY, metaTileColumn, metaTileRow;
+    int cacheHit = 0;
 
-    MG_TRY()
+   MG_TRY()
 
     if (NULL == mapDefinition || baseMapLayerGroupName.empty())
     {
@@ -153,30 +170,75 @@
             __LINE__, __WFILE__, &arguments, L"MgInvalidScaleIndex", NULL);
     }
 
-    // get the service from our helper method
-    Ptr<MgResourceService> resourceService = GetResourceServiceForMapDef(mapDefinition,
-                                            L"MgServerTileService.GetTile");
+    if (sm_useMetaTiles)    //  additional names and control variables for meta tiles
+    {
+        // which subTile from sm_useMetaTiles^2 larger tile
+        subTileX = abs(tileColumn % sm_useMetaTiles);
+        subTileY = abs(tileRow % sm_useMetaTiles);
+        // determine left top corner of metaTile having sm_useMetaTiles**2 subtiles
+        metaTileColumn = tileColumn - subTileX;
+        metaTileRow = tileRow - subTileY;
+        // Generate tile and lock pathnames for meta tile in the mod xx grid
+        m_tileCache->GeneratePathnames(mapDefinition, scaleIndex, baseMapLayerGroupName,
+            metaTileColumn, metaTileRow, metaTilePathname, metaTileLockPathname, false);
+        // init control vars
+        maxX = maxY = sm_useMetaTiles;
+        for (int y=0; y < maxY; y++)    // rows
+        for (int x=0; x < maxX; x++)     // columns
+        {
+            subTileLockFile[x][y] = NULL;
+            // Generate tile and lock pathnames.
+            m_tileCache->GeneratePathnames(mapDefinition, scaleIndex, baseMapLayerGroupName,
+                metaTileColumn + x, metaTileRow + y, subTilePathname[x][y], subTileLockPathname[x][y], false);
+        }
+
+    }    
     // Generate tile and lock pathnames.
     m_tileCache->GeneratePathnames(mapDefinition, scaleIndex, baseMapLayerGroupName,
         tileColumn, tileRow, tilePathname, lockPathname, false);
 
-    // If there is a dangling lock file, then attempt to remove it.
-    if (DetectTileLockFile(lockPathname))
+    if (sm_useMetaTiles)
     {
-        // TODO: Handle the exception by displaying a tile with an error message?
-        MgFileUtil::DeleteFile(lockPathname, true);
-    }
+        if (DetectTileLockFile(metaTileLockPathname))
+        {
+            // TODO: Handle the exception by displaying a tile with an error message?
+            MgFileUtil::DeleteFile(metaTileLockPathname, true);
+            std::wstringstream text;
+            text << L"METATILE: DeletedDanglingLockfile(" << metaTileRow  << L", " <<  metaTileColumn << L") " 
+                << metaTileLockPathname << L")\n" ;
+            ACE_DEBUG ((LM_DEBUG, text.str().c_str()));
+        }        
+    } else
+        // If there is a dangling lock file, then attempt to remove it.
+        if (DetectTileLockFile(lockPathname))
+        {
+            // TODO: Handle the exception by displaying a tile with an error message?
+            MgFileUtil::DeleteFile(lockPathname, true);
+            std::wstringstream text;
+            text << L"METATILE: DeletedDanglingLockfile(" << tileRow  << L", " <<  tileColumn << L") " 
+                << lockPathname << L")\n" ;
+            ACE_DEBUG ((LM_DEBUG, text.str().c_str()));
+        }
 
     // try getting the tile from the cache
     ret = m_tileCache->Get(tilePathname);
 
+    if (ret)
+    {
+        cacheHit = 1;
+        std::wstringstream text;
+        text << L"CACHEHIT: GetTile(" << tileRow  << L", " <<  tileColumn << L") " << tilePathname << L"\n";
+        ACE_DEBUG ((LM_DEBUG, text.str().c_str()));
+    } else {
+        std::wstringstream text;
+        text << L"CACHEMISS: GetTile(" << tileRow  << L", " <<  tileColumn << L") " << tilePathname << L"\n";
+        ACE_DEBUG ((LM_DEBUG, text.str().c_str()));
+    }
+
     // if the reader is NULL then the tile wasn't in the cache and we
     // need to generate it
-    while (NULL == ret)
+    while (NULL == ret) //=======================================================================
     {
-        // Attempt use a cached & serialized MgMap object
-        Ptr<MgMemoryStreamHelper> cachedMap;
-        STRING mapString = mapDefinition->ToString();
         Ptr<MgMap> map;
 
         // Protect the serialized MgMap cache with a mutex.  Stream reading is not
@@ -184,93 +246,186 @@
         // that a Rewind() is not called in the middle of a Deserialize().
         // Lockfile test and creation is in same protected scope.
         {
-            // Attempt to lock the tile file.
+            // Attempt to get the mapcache mutex .
             ACE_MT(ACE_GUARD_RETURN(ACE_Recursive_Thread_Mutex, ace_mon, sm_mutex, NULL));
 
             // Bail out if the tile file has been locked for so long.
-            if (DetectTileLockFile(lockPathname))
+            if (sm_useMetaTiles)
             {
-                MgStringCollection arguments;
-                arguments.Add(lockPathname);
+                if (DetectTileLockFile(metaTileLockPathname))
+                {
+                    MgStringCollection arguments;
+                    arguments.Add(metaTileLockPathname);
 
-                throw new MgFileIoException(L"MgServerTileService.GetTile",
-                    __LINE__, __WFILE__, &arguments, L"MgUnableToLockTileFile", NULL);
-            }
+                    throw new MgFileIoException(L"MgServerTileService.GetTile",
+                        __LINE__, __WFILE__, &arguments, L"MgUnableToLockMetaTileFile", NULL);
+                }        
+            } else
+                if (DetectTileLockFile(lockPathname))
+                {
+                    MgStringCollection arguments;
+                    arguments.Add(lockPathname);
 
+                    throw new MgFileIoException(L"MgServerTileService.GetTile",
+                        __LINE__, __WFILE__, &arguments, L"MgUnableToLockTileFile", NULL);
+                }
+
             // try getting the tile from the cache
             ret = m_tileCache->Get(tilePathname);
 
             if (NULL != ret)
             {
+                std::wstringstream text;
+                text << L"CACHEHIT2: GetTile(" << tileRow  << L", " <<  tileColumn << L") " << tilePathname << L"\n";
+                ACE_DEBUG ((LM_DEBUG, text.str().c_str()));
                 break;  // tile was in tileCache .. done.
+            } else {
+                std::wstringstream text;
+                text << L"CACHEMISS2: GetTile(" << tileRow  << L", " <<  tileColumn << L") " << tilePathname << L"\n";
+                ACE_DEBUG ((LM_DEBUG, text.str().c_str()));
             }
 
-            // Create the lock file and close it right away.
-            m_tileCache->CreateFullPath(mapDefinition, scaleIndex, baseMapLayerGroupName, tileColumn, tileRow);
-            lockFile = ACE_OS::fopen(MG_WCHAR_TO_TCHAR(lockPathname), ACE_TEXT("wb"));
+            //=========================================================================
+            if (!sm_useMetaTiles)        // create sm_useMetaTiles lockfiles
+            {
+                // Create the lock file and close it right away.
+                m_tileCache->CreateFullPath(mapDefinition, scaleIndex, baseMapLayerGroupName, tileColumn, tileRow);
+                lockFile = ACE_OS::fopen(MG_WCHAR_TO_TCHAR(lockPathname), ACE_TEXT("wb"));
 
-            if (NULL == lockFile)
+                if (NULL == lockFile)
+                {
+                    MgStringCollection arguments;
+                    arguments.Add(lockPathname);
+
+                    throw new MgFileIoException(L"MgServerTileService.GetTile",
+                        __LINE__, __WFILE__, &arguments, L"MgUnableToOpenLockFile", NULL);
+                }
+                else
+                {
+                    ACE_OS::fclose(lockFile);
+                }
+            } else 
+            //=========================================================================
             {
-                MgStringCollection arguments;
-                arguments.Add(lockPathname);
+                for (int y=0; y < 1; y++)    // rows                   ---- JUST ONCE THE LOCKFILE
+                for (int x=0; x < 1; x++)    // columns
+                {
+                    // per array element Create the lock file and close it right away.
+                    m_tileCache->CreateFullPath(mapDefinition, scaleIndex, baseMapLayerGroupName, 
+                        metaTileColumn + x, metaTileRow + y);
+                    subTileLockFile[x][y] = ACE_OS::fopen(MG_WCHAR_TO_TCHAR(subTileLockPathname[x][y]), ACE_TEXT("wb"));
 
-                throw new MgFileIoException(L"MgServerTileService.GetTile",
-                    __LINE__, __WFILE__, &arguments, L"MgUnableToOpenLockFile", NULL);
-            }
-            else
+                    if (NULL == subTileLockFile[x][y])
+                    {
+                        MgStringCollection arguments;
+                        arguments.Add(subTilePathname[x][y]);
+
+                        throw new MgFileIoException(L"MgServerTileService.GetTile",
+                            __LINE__, __WFILE__, &arguments, L"MgUnableToOpenLockFile", NULL);
+                    }
+                    else
+                    {
+                        ACE_OS::fclose(subTileLockFile[x][y]);
+                        std::wstringstream text;
+                        text << L"METATILE: CreatedLockfile(" << metaTileRow + y << L", " <<  metaTileColumn + x << L") " 
+                            << L" S(" << x << L", " << y << L") " << subTileLockPathname[x][y] << L")\n";
+                        ACE_DEBUG ((LM_DEBUG, text.str().c_str()));
+                    }
+                } // end meta tiling loop for lockfiles
+            } // if sm_useMetatiles
+            //=========================================================================
+            GetMapFromDefinition(mapDefinition, scaleIndex, map);
+        }   // end of mutex scope
+
+        // Get the tile
+         if (sm_useMetaTiles)
+         {
+            // Render the larger meta tile but do not cache it yet! (sm_useMetaTiles [prohibits caching in GetTile)
+            STRING metaTileName = L"META" + metaTilePathname;
             {
-                ACE_OS::fclose(lockFile);
+                std::wstringstream text;
+                text << L"METATILE: RenderMetaTile(" << metaTileRow << L", " <<   metaTileColumn << L") " << metaTileName << L"\n";
+                ACE_DEBUG ((LM_DEBUG, text.str().c_str()));
             }
+            Ptr<MgByteReader> metaTile = GetTile(metaTileName, map, scaleIndex, baseMapLayerGroupName, metaTileColumn, metaTileRow);
 
-            MapCache::const_iterator iter = sm_mapCache.find(mapString);
-            if (sm_mapCache.end() != iter)
+            // Get a ServerSide rendering Service only...
+            MgServiceManager* serviceMan = MgServiceManager::GetInstance();
+            assert(NULL != serviceMan);
+            Ptr<MgServerRenderingService> svcRendering = dynamic_cast<MgServerRenderingService*>(
+                serviceMan->RequestService(MgServiceType::RenderingService));
+            assert(NULL != svcRendering);
+
+            // splitup the meta tiles up
+            for (int y=0; y < maxY; y++)    // rows
+            for (int x=0; x < maxX; x++)    // columns
             {
-                cachedMap = SAFE_ADDREF((*iter).second);
-                cachedMap->Rewind();
-                Ptr<MgStream> stream = new MgStream(cachedMap);
-                map = new MgMap();
-                map->Deserialize(stream);
-            }
-            else
-            {
-                Ptr<MgSiteConnection> siteConn = new MgSiteConnection();
-                siteConn->Open(MgUserInformation::GetCurrentUserInfo());
-                map = new MgMap(siteConn);
-                map->Create(resourceService, mapDefinition, mapString);
-                cachedMap = new MgMemoryStreamHelper();
-                Ptr<MgStream> stream = new MgStream(cachedMap);
-                map->Serialize(stream);
-                if ((INT32)sm_mapCache.size() >= sm_mapCacheSize)
+                // generate the tile
+                Ptr<MgByteReader> img = svcRendering->RenderTileFromMetaTile(map, metaTile, x,y);
+                if ((subTileX == x) && (subTileY == y)) 
+                    ret = img;       // keep pointer for requested subtile
+                m_tileCache->Set(img, subTilePathname[x][y]);   // store all of them intile cache
+
+                if (img)
                 {
-                    ClearMapCache(L"");
+                    std::wstringstream text;
+                    text << L"METATILE: SetTileFromMetaTile(" << tileRow  << L", " <<  tileColumn << L") " << subTilePathname[x][y]
+                                                << L" S(" << x << L", " << y << L")\n";
+                    ACE_DEBUG ((LM_DEBUG, text.str().c_str()));
                 }
-                sm_mapCache[mapString] = SAFE_ADDREF((MgMemoryStreamHelper*)cachedMap);
+                // rewind the reader since setting the tile advances it to the end
+                if (img)
+                {
+                    img->Rewind();
+                }
             }
-        }   // end of mutex scope
-
-        double scale = map->GetFiniteDisplayScaleAt(scaleIndex);
-        map->SetViewScale(scale);
-
-        // Render the tile and cache it.
-        ret = GetTile(tilePathname, map, scaleIndex, baseMapLayerGroupName, tileColumn, tileRow);
+         } else 
+         {
+            // Render the tile and cache it. 
+            ret = GetTile(tilePathname, map, scaleIndex, baseMapLayerGroupName, tileColumn, tileRow);
+         }
         break;
-    }
+    }   // end of gettile loop end MgMap scope
 
-    MG_CATCH(L"MgServerTileService.GetTile")
+     MG_CATCH(L"MgServerTileService.GetTile")
 
-    if (NULL != lockFile)
+    if (sm_useMetaTiles)        // remove sm_useMetaTiles lockfiles
     {
-        MgFileUtil::DeleteFile(lockPathname, false);
+        for (int y=0; y < 1; y++)    // rows                        --  JUST ONE LOCKFILE
+        for (int x=0; x < 1; x++)    // columns
+        {
+            if (NULL != subTileLockFile[x][y])
+            {
+                MgFileUtil::DeleteFile(subTileLockPathname[x][y], false);
+                {
+                    std::wstringstream text;
+                    text << L"METATILE: DeletedLockfile(" << tileRow  << L", " <<  tileColumn << L") " 
+                        << L" S(" << x << L", " << y << subTileLockPathname[x][y] << L")\n";
+                    ACE_DEBUG ((LM_DEBUG, text.str().c_str()));
+                }
+            }
+        }
+    } else {
+        if (NULL != lockFile)
+        {
+            MgFileUtil::DeleteFile(lockPathname, false);
+        }
     }
-
     MG_THROW()
+    if (!cacheHit) 
+    {
+        std::wstringstream text;
+        text << L"Rendered: GetTILE(" << tileRow  << L", " <<  tileColumn << L") " 
+            << L" S(" << subTileX << L", " << subTileY << tilePathname << L")\n";
+        ACE_DEBUG ((LM_DEBUG, text.str().c_str()));
+    }
 
     return ret.Detach();
 }
 
 
 ///////////////////////////////////////////////////////////////////////////////
-// look for the tile in the tilecache first
+/// APIVERSION 1.0
 MgByteReader* MgServerTileService::GetTile(MgMap* map,
                                            CREFSTRING baseMapLayerGroupName,
                                            INT32 tileColumn,
@@ -394,8 +549,8 @@
         // generate the tile
         img = svcRendering->RenderTile(map, baseMapLayerGroupName, tileColumn, tileRow);
 
-        // cache the tile
-        if (!sm_renderOnly)
+        // cache the tile only when not metatiling
+        if (!sm_renderOnly && !sm_useMetaTiles)
         {
             m_tileCache->Set(img, tilePathname);
 
@@ -488,36 +643,7 @@
     MG_THROW()
 }
 
-
 ///////////////////////////////////////////////////////////////////////////////
-// accessor method for resource service
-MgResourceService* MgServerTileService::GetResourceServiceForMapDef(MgResourceIdentifier* mapDefinition,
-                                                                    CREFSTRING funcName)
-{
-    // get service manager
-    MgServiceManager* serviceMan = MgServiceManager::GetInstance();
-    assert(NULL != serviceMan);
-
-    // Get the service from service manager
-    Ptr<MgResourceService> resourceService = dynamic_cast<MgResourceService*>(
-        serviceMan->RequestService(MgServiceType::ResourceService));
-    assert(NULL != resourceService);
-
-    if (!resourceService->HasPermission(mapDefinition, MgResourcePermission::ReadOnly))
-    {
-        MG_LOG_AUTHENTICATION_ENTRY(MgResources::PermissionDenied.c_str());
-
-        MgStringCollection arguments;
-        arguments.Add(mapDefinition->ToString());
-
-        throw new MgPermissionDeniedException(
-            funcName, __LINE__, __WFILE__, &arguments, L"", NULL);
-    }
-    return resourceService.Detach();
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
 void MgServerTileService::ClearCache(MgMap* map)
 {
     MG_TRY()
@@ -650,3 +776,72 @@
 {
     return MgTileParameters::tileHeight;
 }
+///////////////////////////////////////////////////////////////////////////////
+/// helper to retrieve map
+///////////////////////////////////////////////////////////////////////////////
+void MgServerTileService::GetMapFromDefinition (MgResourceIdentifier* mapDefinition, INT32 scaleIndex, Ptr<MgMap> &map)
+{
+    // Attempt use a cached & serialized MgMap object
+    Ptr<MgMemoryStreamHelper> cachedMap;
+    STRING mapString = mapDefinition->ToString();
+
+    MapCache::const_iterator iter = sm_mapCache.find(mapString);
+    if (sm_mapCache.end() != iter)
+    {
+        cachedMap = SAFE_ADDREF((*iter).second);
+        cachedMap->Rewind();
+        Ptr<MgStream> stream = new MgStream(cachedMap);
+        map = new MgMap();
+        map->Deserialize(stream);
+    }
+    else
+    {
+        // get the service from our helper method
+        Ptr<MgResourceService> resourceService = GetResourceServiceForMapDef(mapDefinition,
+                                            L"MgServerTileService.GetTile");
+        Ptr<MgSiteConnection> siteConn = new MgSiteConnection();
+        siteConn->Open(MgUserInformation::GetCurrentUserInfo());
+        map = new MgMap(siteConn);
+        map->Create(resourceService, mapDefinition, mapString);
+        cachedMap = new MgMemoryStreamHelper();
+        Ptr<MgStream> stream = new MgStream(cachedMap);
+        map->Serialize(stream);
+        if ((INT32)sm_mapCache.size() >= sm_mapCacheSize)
+        {
+            ClearMapCache(L"");
+        }
+        sm_mapCache[mapString] = SAFE_ADDREF((MgMemoryStreamHelper*)cachedMap);
+    }
+
+    double scale = map->GetFiniteDisplayScaleAt(scaleIndex);
+    map->SetViewScale(scale);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// accessor method for resource service
+MgResourceService* MgServerTileService::GetResourceServiceForMapDef(MgResourceIdentifier* mapDefinition,
+                                                                    CREFSTRING funcName)
+{
+    if (m_resourceService) return m_resourceService;
+    // get service manager
+    MgServiceManager* serviceMan = MgServiceManager::GetInstance();
+    assert(NULL != serviceMan);
+
+    // Get the service from service manager
+    Ptr<MgResourceService> resourceService = m_resourceService = dynamic_cast<MgResourceService*>(
+        serviceMan->RequestService(MgServiceType::ResourceService));
+    assert(NULL != resourceService);
+
+    if (!resourceService->HasPermission(mapDefinition, MgResourcePermission::ReadOnly))
+    {
+        MG_LOG_AUTHENTICATION_ENTRY(MgResources::PermissionDenied.c_str());
+
+        MgStringCollection arguments;
+        arguments.Add(mapDefinition->ToString());
+
+        throw new MgPermissionDeniedException(
+            funcName, __LINE__, __WFILE__, &arguments, L"", NULL);
+    }
+    return resourceService.Detach();
+}
+

Modified: sandbox/rfc90/MgDev/Server/src/Services/Tile/ServerTileService.h
===================================================================
--- trunk/MgDev/Server/src/Services/Tile/ServerTileService.h	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Server/src/Services/Tile/ServerTileService.h	2010-03-26 03:01:23 UTC (rev 4700)
@@ -21,6 +21,12 @@
 #include "ServerTileDllExport.h"
 #include "TileCache.h"
 
+#define METATILES
+#define METAMAXDIM 8
+/// forward decl
+class MgServerRenderingService; 
+class RS_Bounds;
+class RS_Color;
 class MG_SERVER_TILE_API MgServerTileService : public MgTileService
 {
     DECLARE_CLASSNAME(MgServerTileService)
@@ -67,9 +73,12 @@
     MgByteReader* GetTile(CREFSTRING tilePathname, MgMap* map, INT32 scaleIndex,
         CREFSTRING baseMapLayerGroupName, INT32 tileColumn, INT32 tileRow);
 
+    void GetMapFromDefinition (MgResourceIdentifier* mapDefinition, INT32 scaleIndex, Ptr<MgMap> &map);
+
     void ClearMapCache(CREFSTRING mapName);
 
     MgResourceService* GetResourceServiceForMapDef(MgResourceIdentifier* mapDefinition, CREFSTRING funcName);
+    MgResourceService* m_resourceService;
 
     // member data
     Ptr<MgTileCache> m_tileCache;
@@ -83,6 +92,7 @@
     static INT32 sm_creationCutoffTime;
     static INT32 sm_pollingInterval;
     static INT32 sm_mapCacheSize;
+    static INT32 sm_useMetaTiles;
 };
 
 #endif

Modified: sandbox/rfc90/MgDev/Server/src/Services/Tile/ServerTileService.vcproj
===================================================================
--- trunk/MgDev/Server/src/Services/Tile/ServerTileService.vcproj	2010-03-26 01:59:59 UTC (rev 4697)
+++ sandbox/rfc90/MgDev/Server/src/Services/Tile/ServerTileService.vcproj	2010-03-26 03:01:23 UTC (rev 4700)
@@ -44,7 +44,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="..\..\..\..\Common\Foundation;..\..\..\..\Common\Geometry;..\..\..\..\Common\PlatformBase;..\..\..\..\Common\MapGuideCommon;..\..\..\..\Common\MdfModel;..\..\Common;..\..\Common\Base;..\..\Common\Manager;..\Mapping;..\..\..\..\Oem\ACE\ACE_wrappers;..\..\..\..\Oem\FDO\inc"
+				AdditionalIncludeDirectories="..\..\..\..\Common\Foundation;..\..\..\..\Common\Geometry;..\..\..\..\Common\PlatformBase;..\..\..\..\Common\MapGuideCommon;..\..\..\..\Common\MdfModel;..\..\Common;..\..\Common\Base;..\..\Common\Manager;..\Mapping;..\Rendering;..\..\..\..\Oem\ACE\ACE_wrappers;..\..\..\..\Oem\FDO\inc"
 				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MG_SERVER_TILE_EXPORTS"
 				MinimalRebuild="true"
 				ExceptionHandling="2"
@@ -123,7 +123,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="..\..\..\..\Common\Foundation;..\..\..\..\Common\Geometry;..\..\..\..\Common\PlatformBase;..\..\..\..\Common\MapGuideCommon;..\..\..\..\Common\MdfModel;..\..\Common;..\..\Common\Base;..\..\Common\Manager;..\Mapping;..\..\..\..\Oem\ACE\ACE_wrappers;..\..\..\..\Oem\FDO\inc"
+				AdditionalIncludeDirectories="..\..\..\..\Common\Foundation;..\..\..\..\Common\Geometry;..\..\..\..\Common\PlatformBase;..\..\..\..\Common\MapGuideCommon;..\..\..\..\Common\MdfModel;..\..\Common;..\..\Common\Base;..\..\Common\Manager;..\Mapping;..\Rendering;..\..\..\..\Oem\ACE\ACE_wrappers;..\..\..\..\Oem\FDO\inc"
 				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MG_SERVER_TILE_EXPORTS"
 				MinimalRebuild="true"
 				ExceptionHandling="2"
@@ -202,7 +202,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="2"
-				AdditionalIncludeDirectories="..\..\..\..\Common\Foundation;..\..\..\..\Common\Geometry;..\..\..\..\Common\PlatformBase;..\..\..\..\Common\MapGuideCommon;..\..\..\..\Common\MdfModel;..\..\Common;..\..\Common\Base;..\..\Common\Manager;..\Mapping;..\..\..\..\Oem\ACE\ACE_wrappers;..\..\..\..\Oem\FDO\inc"
+				AdditionalIncludeDirectories="..\..\..\..\Common\Foundation;..\..\..\..\Common\Geometry;..\..\..\..\Common\PlatformBase;..\..\..\..\Common\MapGuideCommon;..\..\..\..\Common\MdfModel;..\..\Common;..\..\Common\Base;..\..\Common\Manager;..\Mapping;..\Rendering;..\..\..\..\Oem\ACE\ACE_wrappers;..\..\..\..\Oem\FDO\inc"
 				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MG_SERVER_TILE_EXPORTS"
 				ExceptionHandling="2"
 				RuntimeLibrary="2"
@@ -281,7 +281,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="2"
-				AdditionalIncludeDirectories="..\..\..\..\Common\Foundation;..\..\..\..\Common\Geometry;..\..\..\..\Common\PlatformBase;..\..\..\..\Common\MapGuideCommon;..\..\..\..\Common\MdfModel;..\..\Common;..\..\Common\Base;..\..\Common\Manager;..\Mapping;..\..\..\..\Oem\ACE\ACE_wrappers;..\..\..\..\Oem\FDO\inc"
+				AdditionalIncludeDirectories="..\..\..\..\Common\Foundation;..\..\..\..\Common\Geometry;..\..\..\..\Common\PlatformBase;..\..\..\..\Common\MapGuideCommon;..\..\..\..\Common\MdfModel;..\..\Common;..\..\Common\Base;..\..\Common\Manager;..\Rendering;..\Mapping;..\..\..\..\Oem\ACE\ACE_wrappers;..\..\..\..\Oem\FDO\inc"
 				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MG_SERVER_TILE_EXPORTS"
 				ExceptionHandling="2"
 				RuntimeLibrary="2"



More information about the mapguide-commits mailing list