[mapguide-commits] r9533 - in sandbox/jng/mvt: Common/Renderers Server/src/UnitTesting

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Tue Jun 4 07:08:05 PDT 2019


Author: jng
Date: 2019-06-04 07:08:05 -0700 (Tue, 04 Jun 2019)
New Revision: 9533

Modified:
   sandbox/jng/mvt/Common/Renderers/MVTRenderer.cpp
   sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.cpp
   sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.h
   sandbox/jng/mvt/Server/src/UnitTesting/UnitTesting.vcxproj
Log:
MVTRenderer changes:
 - Clip all incoming LineBuffer instances in addition to optimizing them. We can't write "out of bounds" MVT tile coordinates.
 - _ASSERT() that all encoded MVT coordinates lie within [0, 4096], [0, 4096]
 - Fix SE_Matrix setup in StartMap(). The original setup logic applies aspect-ratio-sensitive scaling, which may be fine for image-based renderers, but is not fine for this renderer. Instead, we need to compute separate horizontal and vertical scales.

Also add a unit test to MVT renderer to at least verify that when sending LineBuffer coordinates at tile boundaries that they are transformed to within the range of [0, 4096]. We can't programmatically verify this (with CPPUNIT_ASSERT()), but running the test in debug mode should not trip any of the _ASSERT() land-mines laid in the MVTRenderer.

Modified: sandbox/jng/mvt/Common/Renderers/MVTRenderer.cpp
===================================================================
--- sandbox/jng/mvt/Common/Renderers/MVTRenderer.cpp	2019-06-03 11:56:34 UTC (rev 9532)
+++ sandbox/jng/mvt/Common/Renderers/MVTRenderer.cpp	2019-06-04 14:08:05 UTC (rev 9533)
@@ -20,6 +20,8 @@
 #include "UnicodeString.h"
 #include <vtzero/builder.hpp>
 
+const int MVT_SIZE = 4096;
+
 // =========================== MVTRenderer overview =============================== //
 //
 // MVTRenderer is really just an adapter to connect our Stylizer to the vtzero library
@@ -150,7 +152,30 @@
                 double ty;
                 m_parent->WorldToScreenPoint(x, y, tx, ty);
 
-                builder.set_point(static_cast<int>(tx), static_cast<int>(ty));
+                //Although the source geometry is clipped against the map-space extents beforehand,
+                //the transform may result in a coordinate that lies just over a the tile-space extents.
+                //
+                //If the tile coordinate is indeed on/over the edge, floor()/ceil() it to see if it
+                //"snaps" to the tile edge coordinates.
+                if (tx > MVT_SIZE)
+                    tx = std::floor(tx);
+                
+                if (tx < 0)
+                    tx = std::ceil(tx);
+
+                if (ty > MVT_SIZE)
+                    ty = std::floor(ty);
+
+                if (ty < 0)
+                    ty = std::ceil(ty);
+
+                auto itx = static_cast<int>(std::floor(tx));
+                auto ity = static_cast<int>(std::floor(ty));
+
+                _ASSERT(itx >= 0 && itx <= MVT_SIZE);
+                _ASSERT(itx >= 0 && itx <= MVT_SIZE);
+
+                builder.set_point(itx, ity);
             }
         }
         else //MultiPolygon
@@ -180,7 +205,30 @@
                 double ty;
                 m_parent->WorldToScreenPoint(x, y, tx, ty);
 
-                builder.set_point(static_cast<int>(tx), static_cast<int>(ty));
+                //Although the source geometry is clipped against the map-space extents beforehand,
+                //the transform may result in a coordinate that lies just over a the tile-space extents.
+                //
+                //If the tile coordinate is indeed on/over the edge, floor()/ceil() it to see if it
+                //"snaps" to the tile edge coordinates.
+                if (tx > MVT_SIZE)
+                    tx = std::floor(tx);
+
+                if (tx < 0)
+                    tx = std::ceil(tx);
+
+                if (ty > MVT_SIZE)
+                    ty = std::floor(ty);
+
+                if (ty < 0)
+                    ty = std::ceil(ty);
+
+                auto itx = static_cast<int>(std::floor(tx));
+                auto ity = static_cast<int>(std::floor(ty));
+
+                _ASSERT(itx >= 0 && itx <= MVT_SIZE);
+                _ASSERT(itx >= 0 && itx <= MVT_SIZE);
+
+                builder.set_point(itx, ity);
             }
         }
         else //MultiLineString
@@ -198,6 +246,8 @@
 
         if (lb->point_count() == 1)
         {
+            builder.add_points(1);
+
             auto x = lb->x_coord(0);
             auto y = lb->y_coord(0);
 
@@ -205,7 +255,30 @@
             double ty;
             m_parent->WorldToScreenPoint(x, y, tx, ty);
 
-            builder.set_point(static_cast<int>(tx), static_cast<int>(ty));
+            //Although the source geometry is clipped against the map-space extents beforehand,
+            //the transform may result in a coordinate that lies just over a the tile-space extents.
+            //
+            //If the tile coordinate is indeed on/over the edge, floor()/ceil() it to see if it
+            //"snaps" to the tile edge coordinates.
+            if (tx > MVT_SIZE)
+                tx = std::floor(tx);
+
+            if (tx < 0)
+                tx = std::ceil(tx);
+
+            if (ty > MVT_SIZE)
+                ty = std::floor(ty);
+
+            if (ty < 0)
+                ty = std::ceil(ty);
+
+            auto itx = static_cast<int>(std::floor(tx));
+            auto ity = static_cast<int>(std::floor(ty));
+
+            _ASSERT(itx >= 0 && itx <= MVT_SIZE);
+            _ASSERT(itx >= 0 && itx <= MVT_SIZE);
+
+            builder.set_point(itx, ity);
         }
         else //MultiPoint
         {
@@ -228,8 +301,6 @@
     MVTRenderer* m_parent;
 };
 
-const int MVT_SIZE = 4096;
-
 MVTRenderer::MVTRenderer()
     : m_impl(new MVTRenderer::MVTImpl(this)) //MVTImpl only stashes this pointer in its ctor, nothing is called on it yet
     , m_mapInfo(nullptr)
@@ -254,6 +325,7 @@
 
     // find scale used to convert to pixel coordinates
     // need to take aspect ratios into account
+    /*
     double arDisplay = (double)m_width / (double)m_height;
     double arMap = m_extents.width() / m_extents.height();
 
@@ -261,16 +333,18 @@
     if (arDisplay > arMap)
         scale = (double)m_height / m_extents.height();
     else
-        scale = (double)m_width / m_extents.width();
+    */    
+    double wScale = (double)m_width / m_extents.width();
+    double hScale = (double)m_height / m_extents.height();
 
-    m_xform.x0 = scale;
+    m_xform.x0 = wScale;
     m_xform.x1 = 0.0;
-    m_xform.x2 = -scale * m_extents.minx;
+    m_xform.x2 = -wScale * m_extents.minx;
     m_xform.y0 = 0.0;
-    m_xform.y1 = scale;
-    m_xform.y2 = -scale * m_extents.miny;
+    m_xform.y1 = hScale;
+    m_xform.y2 = -hScale * m_extents.miny;
 
-    m_ixform.x0 = 1.0 / scale;
+    m_ixform.x0 = 1.0 / wScale;
     m_ixform.x1 = 0.0;
     m_ixform.x2 = m_extents.minx;
     m_ixform.y0 = 0.0;
@@ -327,9 +401,25 @@
     auto workbuffer = lb->Optimize(m_drawingScale, m_pPool);
     std::unique_ptr<LineBuffer> spLB(workbuffer);
 
-    m_impl->ProcessPolygon(m_activeFeature, workbuffer);
+    //Also clip the geometry to the extents if required as we do not want to encode
+    //"out of tile" coordinates
+    auto clipped = workbuffer->Clip(m_extents, LineBuffer::ctArea, m_pPool);
+    if (workbuffer != clipped)
+    {
+        if (spLB.get())
+        {
+            LineBufferPool::FreeLineBuffer(m_pPool, spLB.release());
+        }
 
-    LineBufferPool::FreeLineBuffer(m_pPool, spLB.release());
+        workbuffer = clipped;
+        spLB.reset(workbuffer);
+    }
+
+    if (workbuffer)
+        m_impl->ProcessPolygon(m_activeFeature, workbuffer);
+
+    if (spLB.get())
+        LineBufferPool::FreeLineBuffer(m_pPool, spLB.release());
 }
 
 //Entry point for polyline rendering. Perform any pre-rendering operations.
@@ -340,9 +430,25 @@
     auto workbuffer = lb->Optimize(m_drawingScale, m_pPool);
     std::unique_ptr<LineBuffer> spLB(workbuffer);
 
-    m_impl->ProcessPolyline(m_activeFeature, workbuffer);
+    //Also clip the geometry to the extents if required as we do not want to encode
+    //"out of tile" coordinates
+    auto clipped = workbuffer->Clip(m_extents, LineBuffer::ctLine, m_pPool);
+    if (workbuffer != clipped)
+    {
+        if (spLB.get())
+        {
+            LineBufferPool::FreeLineBuffer(m_pPool, spLB.release());
+        }
 
-    LineBufferPool::FreeLineBuffer(m_pPool, spLB.release());
+        workbuffer = clipped;
+        spLB.reset(workbuffer);
+    }
+
+    if (workbuffer)
+        m_impl->ProcessPolyline(m_activeFeature, workbuffer);
+
+    if (spLB.get())
+        LineBufferPool::FreeLineBuffer(m_pPool, spLB.release());
 }
 
 //Entry point for raster/image rendering. Perform any pre-rendering operations.
@@ -361,9 +467,25 @@
     auto workbuffer = lb->Optimize(m_drawingScale, m_pPool);
     std::unique_ptr<LineBuffer> spLB(workbuffer);
 
-    m_impl->ProcessMarker(m_activeFeature, workbuffer);
+    //Also clip the geometry to the extents if required as we do not want to encode
+    //"out of tile" coordinates
+    auto clipped = workbuffer->Clip(m_extents, LineBuffer::ctPoint, m_pPool);
+    if (workbuffer != clipped)
+    {
+        if (spLB.get())
+        {
+            LineBufferPool::FreeLineBuffer(m_pPool, spLB.release());
+        }
 
-    LineBufferPool::FreeLineBuffer(m_pPool, spLB.release());
+        workbuffer = clipped;
+        spLB.reset(workbuffer);
+    }
+
+    if (workbuffer)
+        m_impl->ProcessMarker(m_activeFeature, workbuffer);
+
+    if (spLB.get())
+        LineBufferPool::FreeLineBuffer(m_pPool, spLB.release());
 }
 
 //Entry point for label group rendering.

Modified: sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.cpp
===================================================================
--- sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.cpp	2019-06-03 11:56:34 UTC (rev 9532)
+++ sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.cpp	2019-06-04 14:08:05 UTC (rev 9533)
@@ -25,6 +25,8 @@
 //#include "AGGRenderer.h"
 #include "FoundationDefs.h"
 #include "SE_Renderer.h"
+#include "MVTRenderer.h"
+#include "RS_FeatureReader.h"
 
 const STRING TEST_LOCALE = L"en";
 
@@ -1897,6 +1899,91 @@
     }
 }
 
+class MockRSFeatureReader : public RS_FeatureReader
+{
+public:
+    MockRSFeatureReader(int iterations) : m_iterations(0), m_limit(iterations) { }
+    ~MockRSFeatureReader() { }
+
+    virtual bool ReadNext() 
+    {
+        m_iterations++;
+        return m_iterations < m_limit;
+    }
+    virtual void Close() { }
+    virtual void Reset() { }
+
+    virtual bool            IsNull(const wchar_t* propertyName) { return true; }
+    virtual bool            GetBoolean(const wchar_t* propertyName) { return true;  }
+    virtual FdoInt8         GetByte(const wchar_t* propertyName) { return 0; }
+    virtual FdoDateTime     GetDateTime(const wchar_t* propertyName) { return FdoDateTime(); }
+    virtual float           GetSingle(const wchar_t* propertyName) { return 0.0f; }
+    virtual double          GetDouble(const wchar_t* propertyName) { return 0.0; }
+    virtual FdoInt16        GetInt16(const wchar_t* propertyName) { return 0; }
+    virtual FdoInt32        GetInt32(const wchar_t* propertyName) { return 0; }
+    virtual FdoInt64        GetInt64(const wchar_t* propertyName) { return 0; }
+    virtual const wchar_t*  GetString(const wchar_t* propertyName) { return nullptr; }
+    virtual LineBuffer*     GetGeometry(const wchar_t* propertyName, LineBuffer* lb, CSysTransformer* xformer) { return nullptr; }
+    virtual RS_Raster*      GetRaster(const wchar_t* propertyName) { return nullptr; }
+    virtual const wchar_t*  GetAsString(const wchar_t* propertyName) { return nullptr; }
+    virtual RS_InputStream* GetBLOB(const wchar_t* propertyName) { return nullptr; }
+    virtual RS_InputStream* GetCLOB(const wchar_t* propertyName) { return nullptr; }
+    virtual int             GetPropertyType(const wchar_t* propertyName) { return 0; }
+
+    virtual const wchar_t*        GetGeomPropName() { return nullptr; }
+    virtual const wchar_t*        GetRasterPropName() { return nullptr; }
+    virtual const wchar_t* const* GetIdentPropNames(int& count)
+    {
+        count = -1;
+        return nullptr;
+    }
+    virtual const wchar_t* const* GetPropNames(int& count)
+    {
+        count = -1;
+        return nullptr;
+    }
+
+    virtual FdoIFeatureReader* GetInternalReader() { return nullptr; }
+
+private:
+    int m_iterations;
+    int m_limit;
+};
+
+void TestRenderingService::TestCase_MVTRenderer()
+{
+    MVTRenderer ren;
+
+    Ptr<MgCoordinateSystemFactory> csFactory = new MgCoordinateSystemFactory();
+    Ptr<MgCoordinateSystem> cs = csFactory->CreateFromCode(L"LL84");
+    double metersPerUnit = cs->ConvertCoordinateSystemUnitsToMeters(1.0);
+
+    RS_Bounds extents(-87.7649869909628, 43.6913981287878, -87.6955215108997, 43.7975200004803);
+    RS_MapUIInfo mapInfo;
+    ren.StartMap(&mapInfo, extents, 75000, 96, metersPerUnit, nullptr);
+
+    RS_LayerUIInfo layerInfo;
+    RS_FeatureClassInfo classInfo;
+    ren.StartLayer(&layerInfo, &classInfo);
+
+    MockRSFeatureReader rdr(1);
+    ren.StartFeature(&rdr, true);
+
+    RS_MarkerDef mdef;
+    LineBuffer tl(1);
+    tl.MoveTo(std::min(extents.minx, extents.maxx), std::min(extents.maxy, extents.miny));
+    ren.ProcessMarker(&tl, mdef, false); // Can't assert this, but screen coord should be (0, 0)
+    LineBuffer tr(1);
+    tr.MoveTo(std::max(extents.minx, extents.maxx), std::min(extents.maxy, extents.miny));
+    ren.ProcessMarker(&tr, mdef, false); // Can't assert this, but screen coord should be (4096, 0)
+    LineBuffer bl(1);
+    bl.MoveTo(std::min(extents.minx, extents.maxx), std::max(extents.maxy, extents.miny));
+    ren.ProcessMarker(&bl, mdef, false); // Can't assert this, but screen coord should be (0, 4096)
+    LineBuffer br(1);
+    br.MoveTo(std::max(extents.minx, extents.maxx), std::max(extents.maxy, extents.miny));
+    ren.ProcessMarker(&br, mdef, false); // Can't assert this, but screen coord should be (4096, 4096)
+}
+
 void TestRenderingService::TestCase_RenderTileMVT()
 {
     try

Modified: sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.h
===================================================================
--- sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.h	2019-06-03 11:56:34 UTC (rev 9532)
+++ sandbox/jng/mvt/Server/src/UnitTesting/TestRenderingService.h	2019-06-04 14:08:05 UTC (rev 9533)
@@ -65,6 +65,7 @@
     CPPUNIT_TEST(TestCase_RenderTileXYZ_PNG);
     CPPUNIT_TEST(TestCase_RenderTileUTFGrid);
     CPPUNIT_TEST(TestCase_RenderTileMVT);
+    CPPUNIT_TEST(TestCase_MVTRenderer);
 
     CPPUNIT_TEST(TestCase_StylizationFunctionsPNG8);
 
@@ -231,6 +232,7 @@
     void TestCase_RenderTileXYZ_PNG() { TestCase_RenderTileXYZ(L"PNG", L"png"); }
     void TestCase_RenderTileUTFGrid();
     void TestCase_RenderTileMVT();
+    void TestCase_MVTRenderer();
 
     //PNG8 output tests
     void TestCase_RenderDynamicOverlayPNG8() { TestCase_RenderDynamicOverlay(L"PNG8", L"png"); }

Modified: sandbox/jng/mvt/Server/src/UnitTesting/UnitTesting.vcxproj
===================================================================
--- sandbox/jng/mvt/Server/src/UnitTesting/UnitTesting.vcxproj	2019-06-03 11:56:34 UTC (rev 9532)
+++ sandbox/jng/mvt/Server/src/UnitTesting/UnitTesting.vcxproj	2019-06-04 14:08:05 UTC (rev 9533)
@@ -94,7 +94,7 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\Common;..\Common\Cache;..\Common\Manager;..\Services\Feature;..\Services\Kml;..\Services\Mapping;..\Services\Rendering;..\Services\Resource;..\Services\ServerAdmin;..\Services\Site;..\Services\Tile;..\..\..\Common\Foundation;..\..\..\Common\Geometry;..\..\..\Common\PlatformBase;..\..\..\Common\MapGuideCommon;..\..\..\Common\MdfModel;..\..\..\Common\MdfParser;..\..\..\Common\Stylization;..\..\..\Oem\ACE\ACE_wrappers;..\..\..\Oem\CppUnit-1.9.14\include;..\..\..\Oem\dbxml\xerces-c-src\src;..\..\..\Oem\FDO\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\Common;..\Common\Cache;..\Common\Manager;..\Services\Feature;..\Services\Kml;..\Services\Mapping;..\Services\Rendering;..\Services\Resource;..\Services\ServerAdmin;..\Services\Site;..\Services\Tile;..\..\..\Common\Foundation;..\..\..\Common\Geometry;..\..\..\Common\PlatformBase;..\..\..\Common\MapGuideCommon;..\..\..\Common\MdfModel;..\..\..\Common\MdfParser;..\..\..\Common\Renderers;..\..\..\Common\Stylization;..\..\..\Oem\ACE\ACE_wrappers;..\..\..\Oem\CppUnit-1.9.14\include;..\..\..\Oem\dbxml\xerces-c-src\src;..\..\..\Oem\FDO\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ExceptionHandling>Async</ExceptionHandling>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
@@ -120,7 +120,7 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>..\Common;..\Common\Cache;..\Common\Manager;..\Services\Feature;..\Services\Kml;..\Services\Mapping;..\Services\Rendering;..\Services\Resource;..\Services\ServerAdmin;..\Services\Site;..\Services\Tile;..\..\..\Common\Foundation;..\..\..\Common\Geometry;..\..\..\Common\PlatformBase;..\..\..\Common\MapGuideCommon;..\..\..\Common\MdfModel;..\..\..\Common\MdfParser;..\..\..\Common\Stylization;..\..\..\Oem\ACE\ACE_wrappers;..\..\..\Oem\CppUnit-1.9.14\include;..\..\..\Oem\dbxml\xerces-c-src\src;..\..\..\Oem\FDO\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\Common;..\Common\Cache;..\Common\Manager;..\Services\Feature;..\Services\Kml;..\Services\Mapping;..\Services\Rendering;..\Services\Resource;..\Services\ServerAdmin;..\Services\Site;..\Services\Tile;..\..\..\Common\Foundation;..\..\..\Common\Geometry;..\..\..\Common\PlatformBase;..\..\..\Common\MapGuideCommon;..\..\..\Common\MdfModel;..\..\..\Common\MdfParser;..\..\..\Common\Renderers;..\..\..\Common\Stylization;..\..\..\Oem\ACE\ACE_wrappers;..\..\..\Oem\CppUnit-1.9.14\include;..\..\..\Oem\dbxml\xerces-c-src\src;..\..\..\Oem\FDO\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ExceptionHandling>Async</ExceptionHandling>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
@@ -146,7 +146,7 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <ClCompile>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\Common;..\Common\Cache;..\Common\Manager;..\Services\Feature;..\Services\Kml;..\Services\Mapping;..\Services\Rendering;..\Services\Resource;..\Services\ServerAdmin;..\Services\Site;..\Services\Tile;..\..\..\Common\Foundation;..\..\..\Common\Geometry;..\..\..\Common\PlatformBase;..\..\..\Common\MapGuideCommon;..\..\..\Common\MdfModel;..\..\..\Common\MdfParser;..\..\..\Common\Stylization;..\..\..\Oem\ACE\ACE_wrappers;..\..\..\Oem\CppUnit-1.9.14\include;..\..\..\Oem\dbxml\xerces-c-src\src;..\..\..\Oem\FDO\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\Common;..\Common\Cache;..\Common\Manager;..\Services\Feature;..\Services\Kml;..\Services\Mapping;..\Services\Rendering;..\Services\Resource;..\Services\ServerAdmin;..\Services\Site;..\Services\Tile;..\..\..\Common\Foundation;..\..\..\Common\Geometry;..\..\..\Common\PlatformBase;..\..\..\Common\MapGuideCommon;..\..\..\Common\MdfModel;..\..\..\Common\MdfParser;..\..\..\Common\Renderers;..\..\..\Common\Stylization;..\..\..\Oem\ACE\ACE_wrappers;..\..\..\Oem\CppUnit-1.9.14\include;..\..\..\Oem\dbxml\xerces-c-src\src;..\..\..\Oem\FDO\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ExceptionHandling>Async</ExceptionHandling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
@@ -173,7 +173,7 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <ClCompile>
       <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>..\Common;..\Common\Cache;..\Common\Manager;..\Services\Feature;..\Services\Kml;..\Services\Mapping;..\Services\Rendering;..\Services\Resource;..\Services\ServerAdmin;..\Services\Site;..\Services\Tile;..\..\..\Common\Foundation;..\..\..\Common\Geometry;..\..\..\Common\PlatformBase;..\..\..\Common\MapGuideCommon;..\..\..\Common\MdfModel;..\..\..\Common\MdfParser;..\..\..\Common\Stylization;..\..\..\Oem\ACE\ACE_wrappers;..\..\..\Oem\CppUnit-1.9.14\include;..\..\..\Oem\dbxml\xerces-c-src\src;..\..\..\Oem\FDO\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\Common;..\Common\Cache;..\Common\Manager;..\Services\Feature;..\Services\Kml;..\Services\Mapping;..\Services\Rendering;..\Services\Resource;..\Services\ServerAdmin;..\Services\Site;..\Services\Tile;..\..\..\Common\Foundation;..\..\..\Common\Geometry;..\..\..\Common\PlatformBase;..\..\..\Common\MapGuideCommon;..\..\..\Common\MdfModel;..\..\..\Common\MdfParser;..\..\..\Common\Renderers;..\..\..\Common\Stylization;..\..\..\Oem\ACE\ACE_wrappers;..\..\..\Oem\CppUnit-1.9.14\include;..\..\..\Oem\dbxml\xerces-c-src\src;..\..\..\Oem\FDO\inc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <ExceptionHandling>Async</ExceptionHandling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
@@ -274,6 +274,9 @@
       <Project>{f7334b1b-0efa-47e3-8e66-df158e61b7e4}</Project>
       <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
     </ProjectReference>
+    <ProjectReference Include="..\..\..\Common\Renderers\Renderers.vcxproj">
+      <Project>{38161685-88ed-415e-a545-ccc17be069ae}</Project>
+    </ProjectReference>
     <ProjectReference Include="..\..\..\Common\Security\Security.vcxproj">
       <Project>{7c1c5695-c51c-4017-abef-bc3032cbaf3b}</Project>
       <ReferenceOutputAssembly>false</ReferenceOutputAssembly>



More information about the mapguide-commits mailing list