[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