[mapguide-commits] r9540 - in sandbox/jng/tiling_v3: Common/MapGuideCommon/Resources Common/MapGuideCommon/Services Server/src/Services/Rendering Server/src/Services/Tile Server/src/UnitTesting

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Fri Jun 7 07:19:52 PDT 2019


Author: jng
Date: 2019-06-07 07:19:52 -0700 (Fri, 07 Jun 2019)
New Revision: 9540

Modified:
   sandbox/jng/tiling_v3/Common/MapGuideCommon/Resources/mapguide_en.res
   sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/ProxyRenderingService.cpp
   sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/ProxyRenderingService.h
   sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/RenderingDefs.h
   sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/RenderingService.h
   sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/TileDefs.h
   sandbox/jng/tiling_v3/Server/src/Services/Rendering/OpRenderMetatileXYZ.cpp
   sandbox/jng/tiling_v3/Server/src/Services/Rendering/OpRenderTileXYZ.cpp
   sandbox/jng/tiling_v3/Server/src/Services/Rendering/RenderingOperationFactory.cpp
   sandbox/jng/tiling_v3/Server/src/Services/Rendering/ServerRenderingService.cpp
   sandbox/jng/tiling_v3/Server/src/Services/Rendering/ServerRenderingService.h
   sandbox/jng/tiling_v3/Server/src/Services/Rendering/ServerRenderingServiceBuild.cpp
   sandbox/jng/tiling_v3/Server/src/Services/Tile/ServerTileService.cpp
   sandbox/jng/tiling_v3/Server/src/Services/Tile/ServerTileService.h
   sandbox/jng/tiling_v3/Server/src/Services/Tile/TileCacheXYZProvider.cpp
   sandbox/jng/tiling_v3/Server/src/Services/Tile/TileCacheXYZProvider.h
   sandbox/jng/tiling_v3/Server/src/UnitTesting/TestRenderingService.cpp
   sandbox/jng/tiling_v3/Server/src/UnitTesting/TestRenderingService.h
   sandbox/jng/tiling_v3/Server/src/UnitTesting/TestTileService.cpp
Log:
Implement support for "retina" tiles. This is available for the XYZ provider through a new RetinaScale tile set parameter.

How retina tiles work here is the same as it does in mapguide-rest. If specified and > 1, a tile of (256 * retina_scale) x (256 * retina_scale) is rendered instead.

This support also extends to XYZ meta-tiles.

In the process, a few loose ends were tied up from the round 2 work:

 - Only meta-tile if meta-tile factor > 1 *and* tile format is image-based
 - Add missing wiring for RenderMetatileXYZ proxy service method.

The existing RenderMetatileXYZ unit tests have been extended to test at various retina scales. Since these tests call RenderTileXYZ to produce a visual baseline, we get a 2-for-1 deal on verification.

Modified: sandbox/jng/tiling_v3/Common/MapGuideCommon/Resources/mapguide_en.res
===================================================================
--- sandbox/jng/tiling_v3/Common/MapGuideCommon/Resources/mapguide_en.res	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Common/MapGuideCommon/Resources/mapguide_en.res	2019-06-07 14:19:52 UTC (rev 9540)
@@ -452,6 +452,7 @@
 MgTileProvider_Common_Property_TileExtentOffset_LocalizedName = Tile Extent Offset
 MgTileProvider_Common_Property_MetaTileFactor_LocalizedName = Meta-tiling factor
 MgTileProvider_Common_Property_MetaTileLockMethod_LocalizedName = Meta-tiling lock method
+MgTileProvider_XYZ_Property_RetinaScale_LocalizedName = Scaling factor for Retina Tiles
 
 
 # *****************************************************************************

Modified: sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/ProxyRenderingService.cpp
===================================================================
--- sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/ProxyRenderingService.cpp	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/ProxyRenderingService.cpp	2019-06-07 14:19:52 UTC (rev 9540)
@@ -234,15 +234,16 @@
     INT32 z,
     INT32 dpi,
     CREFSTRING tileImageFormat,
-    double tileExtentOffset)
+    double tileExtentOffset,
+    INT32 retinaScale)
 {
     MgCommand cmd;
-    cmd.ExecuteCommand(m_connProp,                                      // Connection
+    cmd.ExecuteCommand(m_connProp,                      // Connection
         MgCommand::knObject,                            // Return type expected
         MgRenderingServiceOpId::RenderTileXYZ2,         // Command Code
-        8,                                              // No of arguments
+        9,                                              // No of arguments
         Rendering_Service,                              // Service Id
-        BUILD_VERSION(4,0,0),                         // Operation version
+        BUILD_VERSION(4,0,0),                           // Operation version
         MgCommand::knObject, map,                       // Argument#1
         MgCommand::knString, &baseMapLayerGroupName,    // Argument#2
         MgCommand::knInt32, x,                          // Argument#3
@@ -251,6 +252,7 @@
         MgCommand::knInt32, dpi,                        // Argument#6
         MgCommand::knString, &tileImageFormat,          // Argument#7
         MgCommand::knDouble, tileExtentOffset,          // Argument#8
+        MgCommand::knInt32, retinaScale,                // Argument#9
         MgCommand::knNone);                             // End of arguments
 
     SetWarning(cmd.GetWarningObject());
@@ -1379,15 +1381,16 @@
     INT32 dpi,
     CREFSTRING tileImageFormat,
     double tileExtentOffset,
-    INT32 metaTilingFactor)
+    INT32 metaTilingFactor,
+    INT32 retinaScale)
 {
     MgCommand cmd;
     cmd.ExecuteCommand(m_connProp,                      // Connection
         MgCommand::knObject,                            // Return type expected
-        MgRenderingServiceOpId::RenderTileXYZ2,         // Command Code
-        9,                                              // No of arguments
+        MgRenderingServiceOpId::RenderMetatileXYZ,      // Command Code
+        10,                                             // No of arguments
         Rendering_Service,                              // Service Id
-        BUILD_VERSION(4,0,0),                         // Operation version
+        BUILD_VERSION(4,0,0),                           // Operation version
         MgCommand::knObject, map,                       // Argument#1
         MgCommand::knString, &baseMapLayerGroupName,    // Argument#2
         MgCommand::knInt32, x,                          // Argument#3
@@ -1397,6 +1400,7 @@
         MgCommand::knString, &tileImageFormat,          // Argument#7
         MgCommand::knDouble, tileExtentOffset,          // Argument#8
         MgCommand::knInt32, metaTilingFactor,           // Argument#9
+        MgCommand::knInt32, retinaScale,                // Argument#10
         MgCommand::knNone);                             // End of arguments
 
     SetWarning(cmd.GetWarningObject());

Modified: sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/ProxyRenderingService.h
===================================================================
--- sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/ProxyRenderingService.h	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/ProxyRenderingService.h	2019-06-07 14:19:52 UTC (rev 9540)
@@ -263,6 +263,8 @@
     /// Specifies the ratio by which the tile to be rendered should be "buffered out". The tile will be rendered at the specified width
     /// multiplied by the given ration, which will be cropped back to the original requested size after rendering. This is to improve
     /// label placement on rendered tiles by giving extra "breathing space" to label placement algorithms.
+    /// \param retinaScale
+    /// The scaling factor to apply for "retina" tiles
     ///
     /// \return
     /// A byte reader containing the rendered tile image.
@@ -276,7 +278,8 @@
         INT32 z,
         INT32 dpi,
         CREFSTRING tileImageFormat,
-        double tileExtentOffset);
+        double tileExtentOffset,
+        INT32 retinaScale);
 
     /////////////////////////////////////////////////////////////////
     /// \brief
@@ -1206,6 +1209,9 @@
     /// The meta-tiling factor. If less than or equal to 1, no meta-tiling is done and the returned meta-tile can be extracted
     /// as the orignally requested tile image. If greater than 1, a tile that is m times bigger than the requested tile is rendered
     /// (where m is the specified tiling factor) and the raw image frame buffer of this meta-tile is returned instead.
+    /// \param retinaScale
+    /// Input
+    /// The scaling factor to apply for "retina" tiles
     ///
     /// \return
     /// A meta-tile with sufficient information for the consumer to properly sub-divide this back into sub-tiles of the
@@ -1221,7 +1227,8 @@
         INT32 dpi,
         CREFSTRING tileImageFormat,
         double tileExtentOffset,
-        INT32 metaTilingFactor);
+        INT32 metaTilingFactor,
+        INT32 retinaScale);
 
     /////////////////////////////////////////////////////////////////
     /// \brief

Modified: sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/RenderingDefs.h
===================================================================
--- sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/RenderingDefs.h	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/RenderingDefs.h	2019-06-07 14:19:52 UTC (rev 9540)
@@ -49,6 +49,7 @@
     static const int QueryFeatureProperties3    = 0x1111E915;
     static const int RenderMetatile             = 0x1111E916;
     static const int RenderTileFromMetaTile     = 0x1111E917;
+    static const int RenderMetatileXYZ          = 0x1111E918;
 };
 /// \endcond
 

Modified: sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/RenderingService.h
===================================================================
--- sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/RenderingService.h	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/RenderingService.h	2019-06-07 14:19:52 UTC (rev 9540)
@@ -278,6 +278,8 @@
     /// Specifies the ratio by which the tile to be rendered should be "buffered out". The tile will be rendered at the specified width
     /// multiplied by the given ration, which will be cropped back to the original requested size after rendering. This is to improve
     /// label placement on rendered tiles by giving extra "breathing space" to label placement algorithms.
+    /// \param retinaScale
+    /// The scaling factor to apply for "retina" tiles
     ///
     /// \return
     /// A byte reader containing the rendered tile image.
@@ -291,7 +293,8 @@
         INT32 z,
         INT32 dpi,
         CREFSTRING tileImageFormat,
-        double tileExtentOffset) = 0;
+        double tileExtentOffset,
+        INT32 retinaScale) = 0;
 
     /////////////////////////////////////////////////////////////////
     /// \brief
@@ -1221,6 +1224,9 @@
     /// The meta-tiling factor. If less than or equal to 1, no meta-tiling is done and the returned meta-tile can be extracted
     /// as the orignally requested tile image. If greater than 1, a tile that is m times bigger than the requested tile is rendered
     /// (where m is the specified tiling factor) and the raw image frame buffer of this meta-tile is returned instead.
+    /// \param retinaScale
+    /// Input
+    /// The scaling factor to apply for "retina" tiles
     ///
     /// \return
     /// A meta-tile with sufficient information for the consumer to properly sub-divide this back into sub-tiles of the
@@ -1236,7 +1242,8 @@
         INT32 dpi,
         CREFSTRING tileImageFormat,
         double tileExtentOffset,
-        INT32 metaTilingFactor) = 0;
+        INT32 metaTilingFactor,
+        INT32 retinaScale) = 0;
 
 
     /////////////////////////////////////////////////////////////////

Modified: sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/TileDefs.h
===================================================================
--- sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/TileDefs.h	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Common/MapGuideCommon/Services/TileDefs.h	2019-06-07 14:19:52 UTC (rev 9540)
@@ -69,6 +69,7 @@
 #define MG_TILE_PROVIDER_COMMON_PARAM_TILEEXTENTOFFSET   L"TileExtentOffset"
 #define MG_TILE_PROVIDER_COMMON_PARAM_METATILEFACTOR     L"MetaTileFactor"
 #define MG_TILE_PROVIDER_COMMON_PARAM_METATILELOCKMETHOD L"MetaTileLockMethod"
+#define MG_TILE_PROVIDER_XYZ_PARAM_RETINASCALE           L"RetinaScale"
 
 #define MG_METATILE_MAX_FACTOR 8
 

Modified: sandbox/jng/tiling_v3/Server/src/Services/Rendering/OpRenderMetatileXYZ.cpp
===================================================================
--- sandbox/jng/tiling_v3/Server/src/Services/Rendering/OpRenderMetatileXYZ.cpp	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Server/src/Services/Rendering/OpRenderMetatileXYZ.cpp	2019-06-07 14:19:52 UTC (rev 9540)
@@ -38,7 +38,7 @@
 
     ACE_ASSERT(m_stream != NULL);
 
-    if (8 == m_packet.m_NumArguments)
+    if (10 == m_packet.m_NumArguments)
     {
         Ptr<MgMap> map = (MgMap*)m_stream->GetObject();
         Ptr<MgResourceIdentifier> resource = map->GetResourceId();
@@ -68,6 +68,9 @@
         INT32 metaTilingFactor = 0;
         m_stream->GetInt32(metaTilingFactor);
 
+        INT32 retinaScale = 1;
+        m_stream->GetInt32(retinaScale);
+
         BeginExecution();
 
         MG_LOG_OPERATION_MESSAGE_PARAMETERS_START();
@@ -88,11 +91,13 @@
         MG_LOG_OPERATION_MESSAGE_ADD_DOUBLE(tileExtentOffset);
         MG_LOG_OPERATION_MESSAGE_ADD_SEPARATOR();
         MG_LOG_OPERATION_MESSAGE_ADD_INT32(metaTilingFactor);
+        MG_LOG_OPERATION_MESSAGE_ADD_SEPARATOR();
+        MG_LOG_OPERATION_MESSAGE_ADD_INT32(retinaScale);
         MG_LOG_OPERATION_MESSAGE_PARAMETERS_END();
 
         Validate();
 
-        Ptr<MgMetatile> metaTile = m_service->RenderMetatileXYZ(map, baseMapLayerGroupName, x, y, z, tileDpi, tileImageFormat, tileExtentOffset, metaTilingFactor);
+        Ptr<MgMetatile> metaTile = m_service->RenderMetatileXYZ(map, baseMapLayerGroupName, x, y, z, tileDpi, tileImageFormat, tileExtentOffset, metaTilingFactor, retinaScale);
 
         EndExecution(metaTile);
     }

Modified: sandbox/jng/tiling_v3/Server/src/Services/Rendering/OpRenderTileXYZ.cpp
===================================================================
--- sandbox/jng/tiling_v3/Server/src/Services/Rendering/OpRenderTileXYZ.cpp	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Server/src/Services/Rendering/OpRenderTileXYZ.cpp	2019-06-07 14:19:52 UTC (rev 9540)
@@ -146,7 +146,7 @@
 
         EndExecution(byteReader);
     }
-    else if (8 == m_packet.m_NumArguments)
+    else if (9 == m_packet.m_NumArguments)
     {
         Ptr<MgMap> map = (MgMap*)m_stream->GetObject();
         Ptr<MgResourceIdentifier> resource = map->GetResourceId();
@@ -173,6 +173,9 @@
         double tileExtentOffset = 0.0;
         m_stream->GetDouble(tileExtentOffset);
 
+        INT32 retinaScale = 1;
+        m_stream->GetInt32(retinaScale);
+
         BeginExecution();
 
         MG_LOG_OPERATION_MESSAGE_PARAMETERS_START();
@@ -191,11 +194,13 @@
         MG_LOG_OPERATION_MESSAGE_ADD_STRING(tileImageFormat.c_str());
         MG_LOG_OPERATION_MESSAGE_ADD_SEPARATOR();
         MG_LOG_OPERATION_MESSAGE_ADD_DOUBLE(tileExtentOffset);
+        MG_LOG_OPERATION_MESSAGE_ADD_SEPARATOR();
+        MG_LOG_OPERATION_MESSAGE_ADD_INT32(retinaScale);
         MG_LOG_OPERATION_MESSAGE_PARAMETERS_END();
 
         Validate();
 
-        Ptr<MgByteReader> byteReader = m_service->RenderTileXYZ(map, baseMapLayerGroupName, x, y, z, tileDpi, tileImageFormat, tileExtentOffset);
+        Ptr<MgByteReader> byteReader = m_service->RenderTileXYZ(map, baseMapLayerGroupName, x, y, z, tileDpi, tileImageFormat, tileExtentOffset, retinaScale);
 
         EndExecution(byteReader);
     }

Modified: sandbox/jng/tiling_v3/Server/src/Services/Rendering/RenderingOperationFactory.cpp
===================================================================
--- sandbox/jng/tiling_v3/Server/src/Services/Rendering/RenderingOperationFactory.cpp	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Server/src/Services/Rendering/RenderingOperationFactory.cpp	2019-06-07 14:19:52 UTC (rev 9540)
@@ -101,6 +101,7 @@
         switch (VERSION_NO_PHASE(operationVersion))
         {
         case VERSION_SUPPORTED(3,0):
+        case VERSION_SUPPORTED(4,0):
             handler.reset(new MgOpRenderTileXYZ());
             break;
         default:
@@ -119,6 +120,17 @@
                 L"MgRenderingOperationFactory.GetOperation", __LINE__, __WFILE__, NULL, L"", NULL);
         }
         break;
+    case MgRenderingServiceOpId::RenderMetatileXYZ:
+        switch (VERSION_NO_PHASE(operationVersion))
+        {
+        case VERSION_SUPPORTED(4,0):
+            handler.reset(new MgOpRenderMetatileXYZ());
+            break;
+        default:
+            throw new MgInvalidOperationVersionException(
+                L"MgRenderingOperationFactory.GetOperation", __LINE__, __WFILE__, NULL, L"", NULL);
+        }
+        break;
     case MgRenderingServiceOpId::RenderTileFromMetaTile:
         switch (VERSION_NO_PHASE(operationVersion))
         {

Modified: sandbox/jng/tiling_v3/Server/src/Services/Rendering/ServerRenderingService.cpp
===================================================================
--- sandbox/jng/tiling_v3/Server/src/Services/Rendering/ServerRenderingService.cpp	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Server/src/Services/Rendering/ServerRenderingService.cpp	2019-06-07 14:19:52 UTC (rev 9540)
@@ -274,7 +274,7 @@
 
     MG_TRY()
 
-    ret = RenderTileXYZ(map, baseMapLayerGroupName, x, y, z, dpi, tileImageFormat, tileExtentOffset);
+    ret = RenderTileXYZ(map, baseMapLayerGroupName, x, y, z, dpi, tileImageFormat, tileExtentOffset, 1 /* retinaScale */);
 
     MG_CATCH_AND_THROW(L"MgServerRenderingService.RenderTileXYZ")
 
@@ -2251,7 +2251,8 @@
                                                       INT32 z,
                                                       INT32 dpi,
                                                       CREFSTRING tileImageFormat,
-                                                      double tileExtentOffset)
+                                                      double tileExtentOffset,
+                                                      INT32 retinaScale)
 {
     Ptr<MgByteReader> ret;
 
@@ -2258,10 +2259,10 @@
     MG_TRY()
 
     INT32 metaTilingFactor = 0;
-    Ptr<MgMetatile> metaTile = RenderMetatileXYZ(map, baseMapLayerGroupName, x, y, z, dpi, tileImageFormat, tileExtentOffset, metaTilingFactor);
+    Ptr<MgMetatile> metaTile = RenderMetatileXYZ(map, baseMapLayerGroupName, x, y, z, dpi, tileImageFormat, tileExtentOffset, metaTilingFactor, retinaScale);
 
-    _ASSERT(metaTile->GetRequestedWidth() == XYZ_TILE_WIDTH);
-    _ASSERT(metaTile->GetRequestedHeight() == XYZ_TILE_HEIGHT);
+    _ASSERT(metaTile->GetRequestedWidth() == (XYZ_TILE_WIDTH * std::max(retinaScale, 1)));
+    _ASSERT(metaTile->GetRequestedHeight() == (XYZ_TILE_HEIGHT * std::max(retinaScale, 1)));
     _ASSERT(metaTile->GetMetaTilingFactor() <= 1);
 
     ret = metaTile->GetImage();
@@ -2393,7 +2394,8 @@
                                                         INT32 dpi,
                                                         CREFSTRING tileImageFormat,
                                                         double tileExtentOffset,
-                                                        INT32 metaTilingFactor)
+                                                        INT32 metaTilingFactor,
+                                                        INT32 retinaScale)
 {
     Ptr<MgMetatile> ret;
 
@@ -2441,8 +2443,11 @@
     StylizationUtil::ParseColor(map->GetBackgroundColor(), bgColor);
     bgColor.alpha() = 0;
     
-    INT32 width = XYZ_TILE_WIDTH * std::max(metaTilingFactor, 1);
-    INT32 height = XYZ_TILE_HEIGHT * std::max(metaTilingFactor, 1);
+    INT32 xyzWidth = (XYZ_TILE_WIDTH * std::max(1, retinaScale));
+    INT32 xyzHeight = (XYZ_TILE_HEIGHT * std::max(1, retinaScale));
+
+    INT32 width = xyzWidth * std::max(metaTilingFactor, 1);
+    INT32 height = xyzHeight * std::max(metaTilingFactor, 1);
     INT32 drawWidth = width;
     INT32 drawHeight = height;
     double scale = 0.0;
@@ -2480,7 +2485,7 @@
         tile = RenderMapInternal(map, NULL, roLayers, dr.get(), drawWidth, drawHeight, drawWidth, drawHeight, format, scale, extent, true, true, false, NULL);
     else
         tile = RenderMapInternal(map, NULL, roLayers, dr.get(), drawWidth, drawHeight, width, height, format, scale, extent, true, true, false, NULL);
-    ret = new MgMetatile(tile, drawWidth, drawHeight, XYZ_TILE_WIDTH, XYZ_TILE_HEIGHT, tileImageFormat, metaTilingFactor);
+    ret = new MgMetatile(tile, drawWidth, drawHeight, xyzWidth, xyzHeight, tileImageFormat, metaTilingFactor);
 
     // restore the base group's visibility
     baseGroup->SetVisible(groupVisible);

Modified: sandbox/jng/tiling_v3/Server/src/Services/Rendering/ServerRenderingService.h
===================================================================
--- sandbox/jng/tiling_v3/Server/src/Services/Rendering/ServerRenderingService.h	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Server/src/Services/Rendering/ServerRenderingService.h	2019-06-07 14:19:52 UTC (rev 9540)
@@ -90,7 +90,8 @@
                                         INT32 z,
                                         INT32 dpi,
                                         CREFSTRING tileImageFormat,
-                                        double tileExtentOffset);
+                                        double tileExtentOffset,
+                                        INT32 retinaScale);
 
     virtual MgByteReader* RenderTileUTFGrid(MgMap* map,
                                             CREFSTRING baseMapLayerGroupName,
@@ -284,7 +285,8 @@
                                           INT32 dpi,
                                           CREFSTRING tileImageFormat,
                                           double tileExtentOffset,
-                                          INT32 metaTilingFactor);
+                                          INT32 metaTilingFactor,
+                                          INT32 retinaScale);
 
     virtual MgByteReader* RenderTileFromMetaTile(MgMap* map, MgMetatile* metaTile, CREFSTRING rendererName, INT32 subTileX, INT32 subTileY);
 

Modified: sandbox/jng/tiling_v3/Server/src/Services/Rendering/ServerRenderingServiceBuild.cpp
===================================================================
--- sandbox/jng/tiling_v3/Server/src/Services/Rendering/ServerRenderingServiceBuild.cpp	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Server/src/Services/Rendering/ServerRenderingServiceBuild.cpp	2019-06-07 14:19:52 UTC (rev 9540)
@@ -24,6 +24,7 @@
 #include "OpRenderMap.cpp"
 #include "OpRenderMapLegend.cpp"
 #include "OpRenderMetatile.cpp"
+#include "OpRenderMetatileXYZ.cpp"
 #include "OpRenderTileFromMetatile.cpp"
 #include "OpRenderTile.cpp"
 #include "OpRenderTileXYZ.cpp"

Modified: sandbox/jng/tiling_v3/Server/src/Services/Tile/ServerTileService.cpp
===================================================================
--- sandbox/jng/tiling_v3/Server/src/Services/Tile/ServerTileService.cpp	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Server/src/Services/Tile/ServerTileService.cpp	2019-06-07 14:19:52 UTC (rev 9540)
@@ -153,6 +153,93 @@
     return ret;
 }
 
+void MgServerTileService::WriteCommonTileProviderProperties(std::string& xml)
+{
+    //Property: TilePath
+    xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"true\">\n");
+    xml.append("<Name>");
+    std::string mbTilePath;
+    MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_COMMON_PARAM_TILEPATH, mbTilePath);
+    xml.append(mbTilePath);
+    xml.append("</Name>\n");
+    xml.append("<LocalizedName>");
+    std::string mbLocName;
+    STRING wLocName = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_Common_Property_TilePath_LocalizedName");
+    MgUtil::WideCharToMultiByte(wLocName, mbLocName);
+    xml.append(mbLocName);
+    xml.append("</LocalizedName>\n");
+    xml.append("<DefaultValue>");
+    std::string mbDefaultTag;
+    MgUtil::WideCharToMultiByte(MgResourceTag::TileCachePath, mbDefaultTag);
+    xml.append(mbDefaultTag);
+    xml.append("</DefaultValue>\n");
+    xml.append("</ConnectionProperty>\n");
+
+    //Property: RenderOnly
+    xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"false\">\n");
+    xml.append("<Name>");
+    std::string mbRenderOnly;
+    MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_COMMON_PARAM_RENDERONLY, mbRenderOnly);
+    xml.append(mbRenderOnly);
+    xml.append("</Name>\n");
+    xml.append("<LocalizedName>");
+    std::string mbLocRenderOnly;
+    STRING wLocRenderOnly = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_Common_Property_RenderOnly_LocalizedName");
+    MgUtil::WideCharToMultiByte(wLocRenderOnly, mbLocRenderOnly);
+    xml.append(mbLocRenderOnly);
+    xml.append("</LocalizedName>\n");
+    xml.append("<DefaultValue>false</DefaultValue>\n");
+    xml.append("</ConnectionProperty>\n");
+
+    //Property: TileExtentOffset
+    xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"true\">\n");
+    xml.append("<Name>");
+    std::string mbTileExtentOffset;
+    MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_COMMON_PARAM_TILEEXTENTOFFSET, mbTileExtentOffset);
+    xml.append(mbTileExtentOffset);
+    xml.append("</Name>\n");
+    xml.append("<LocalizedName>");
+    std::string mbLocTileExtentOffset;
+    STRING wLocTileExtentOffset = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_Common_Property_TileExtentOffset_LocalizedName");
+    MgUtil::WideCharToMultiByte(wLocTileExtentOffset, mbLocTileExtentOffset);
+    xml.append(mbLocTileExtentOffset);
+    xml.append("</LocalizedName>\n");
+    xml.append("<DefaultValue></DefaultValue>\n");
+    xml.append("</ConnectionProperty>\n");
+
+    //Property: MetaTileFactor
+    xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"true\">\n");
+    xml.append("<Name>");
+    std::string mbMetaTileFactor;
+    MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_COMMON_PARAM_METATILEFACTOR, mbMetaTileFactor);
+    xml.append(mbMetaTileFactor);
+    xml.append("</Name>\n");
+    xml.append("<LocalizedName>");
+    std::string mbLocMetaTileFactor;
+    STRING wLocMetaTileFactor = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_Common_Property_MetaTileFactor_LocalizedName");
+    MgUtil::WideCharToMultiByte(wLocMetaTileFactor, mbLocMetaTileFactor);
+    xml.append(mbLocMetaTileFactor);
+    xml.append("</LocalizedName>\n");
+    xml.append("<DefaultValue></DefaultValue>\n");
+    xml.append("</ConnectionProperty>\n");
+
+    //Property: MetaTileLockMethod
+    xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"true\">\n");
+    xml.append("<Name>");
+    std::string mbMetaTileLockMethod;
+    MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_COMMON_PARAM_METATILELOCKMETHOD, mbMetaTileLockMethod);
+    xml.append(mbMetaTileLockMethod);
+    xml.append("</Name>\n");
+    xml.append("<LocalizedName>");
+    std::string mbLocMetaTileLockMethod;
+    STRING wLocMetaTileLockMethod = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_Common_Property_MetaTileLockMethod_LocalizedName");
+    MgUtil::WideCharToMultiByte(wLocMetaTileLockMethod, mbLocMetaTileLockMethod);
+    xml.append(mbLocMetaTileLockMethod);
+    xml.append("</LocalizedName>\n");
+    xml.append("<DefaultValue></DefaultValue>\n");
+    xml.append("</ConnectionProperty>\n");
+}
+
 MgByteReader* MgServerTileService::GetTileProviders()
 {
     Ptr<MgByteReader> ret;
@@ -186,27 +273,7 @@
         xml.append(mbDescription);
         xml.append("</Description>\n");
         xml.append("<ConnectionProperties>\n");
-    
-        //Property: TilePath
-        xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"true\">\n");
-        xml.append("<Name>");
-        std::string mbTilePath;
-        MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_COMMON_PARAM_TILEPATH, mbTilePath);
-        xml.append(mbTilePath);
-        xml.append("</Name>\n");
-        xml.append("<LocalizedName>");
-        std::string mbLocName;
-        STRING wLocName = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_Common_Property_TilePath_LocalizedName");
-        MgUtil::WideCharToMultiByte(wLocName, mbLocName);
-        xml.append(mbLocName);
-        xml.append("</LocalizedName>\n");
-        xml.append("<DefaultValue>");
-        std::string mbDefaultTag;
-        MgUtil::WideCharToMultiByte(MgResourceTag::TileCachePath, mbDefaultTag);
-        xml.append(mbDefaultTag);
-        xml.append("</DefaultValue>\n");
-        xml.append("</ConnectionProperty>\n");
-    
+
         //Property: TileWidth
         xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"true\">\n");
         xml.append("<Name>");
@@ -269,22 +336,6 @@
 
         xml.append("</ConnectionProperty>\n");
 
-        //Property: RenderOnly
-        xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"false\">\n");
-        xml.append("<Name>");
-        std::string mbRenderOnly;
-        MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_COMMON_PARAM_RENDERONLY, mbRenderOnly);
-        xml.append(mbRenderOnly);
-        xml.append("</Name>\n");
-        xml.append("<LocalizedName>");
-        std::string mbLocRenderOnly;
-        STRING wLocRenderOnly = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_Common_Property_RenderOnly_LocalizedName");
-        MgUtil::WideCharToMultiByte(wLocRenderOnly, mbLocRenderOnly);
-        xml.append(mbLocRenderOnly);
-        xml.append("</LocalizedName>\n");
-        xml.append("<DefaultValue>false</DefaultValue>\n");
-        xml.append("</ConnectionProperty>\n");
-
         //Property: CoordinateSystem
         xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"true\">\n");
         xml.append("<Name>");
@@ -317,54 +368,8 @@
         xml.append("<DefaultValue></DefaultValue>\n");
         xml.append("</ConnectionProperty>\n");
 
-        //Property: TileExtentOffset
-        xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"true\">\n");
-        xml.append("<Name>");
-        std::string mbTileExtentOffset;
-        MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_COMMON_PARAM_TILEEXTENTOFFSET, mbTileExtentOffset);
-        xml.append(mbTileExtentOffset);
-        xml.append("</Name>\n");
-        xml.append("<LocalizedName>");
-        std::string mbLocTileExtentOffset;
-        STRING wLocTileExtentOffset = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_Common_Property_TileExtentOffset_LocalizedName");
-        MgUtil::WideCharToMultiByte(wLocTileExtentOffset, mbLocTileExtentOffset);
-        xml.append(mbLocTileExtentOffset);
-        xml.append("</LocalizedName>\n");
-        xml.append("<DefaultValue></DefaultValue>\n");
-        xml.append("</ConnectionProperty>\n");
+        WriteCommonTileProviderProperties(xml);
 
-        //Property: MetaTileFactor
-        xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"true\">\n");
-        xml.append("<Name>");
-        std::string mbMetaTileFactor;
-        MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_COMMON_PARAM_METATILEFACTOR, mbMetaTileFactor);
-        xml.append(mbMetaTileFactor);
-        xml.append("</Name>\n");
-        xml.append("<LocalizedName>");
-        std::string mbLocMetaTileFactor;
-        STRING wLocMetaTileFactor = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_Common_Property_MetaTileFactor_LocalizedName");
-        MgUtil::WideCharToMultiByte(wLocMetaTileFactor, mbLocMetaTileFactor);
-        xml.append(mbLocMetaTileFactor);
-        xml.append("</LocalizedName>\n");
-        xml.append("<DefaultValue></DefaultValue>\n");
-        xml.append("</ConnectionProperty>\n");
-
-        //Property: MetaTileLockMethod
-        xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"true\">\n");
-        xml.append("<Name>");
-        std::string mbMetaTileLockMethod;
-        MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_COMMON_PARAM_METATILELOCKMETHOD, mbMetaTileLockMethod);
-        xml.append(mbMetaTileLockMethod);
-        xml.append("</Name>\n");
-        xml.append("<LocalizedName>");
-        std::string mbLocMetaTileLockMethod;
-        STRING wLocMetaTileLockMethod = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_Common_Property_MetaTileLockMethod_LocalizedName");
-        MgUtil::WideCharToMultiByte(wLocMetaTileLockMethod, mbLocMetaTileLockMethod);
-        xml.append(mbLocMetaTileLockMethod);
-        xml.append("</LocalizedName>\n");
-        xml.append("<DefaultValue></DefaultValue>\n");
-        xml.append("</ConnectionProperty>\n");
-
         xml.append("</ConnectionProperties>\n");
         xml.append("</TileProvider>\n");
     }
@@ -390,26 +395,6 @@
         xml.append(mbDescription);
         xml.append("</Description>\n");
         xml.append("<ConnectionProperties>\n");
-    
-        //Property: TilePath
-        xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"true\">\n");
-        xml.append("<Name>");
-        std::string mbTilePath;
-        MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_COMMON_PARAM_TILEPATH, mbTilePath);
-        xml.append(mbTilePath);
-        xml.append("</Name>\n");
-        xml.append("<LocalizedName>");
-        std::string mbLocName;
-        STRING wLocName = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_Common_Property_TilePath_LocalizedName");
-        MgUtil::WideCharToMultiByte(wLocName, mbLocName);
-        xml.append(mbLocName);
-        xml.append("</LocalizedName>\n");
-        xml.append("<DefaultValue>");
-        std::string mbDefaultTag;
-        MgUtil::WideCharToMultiByte(MgResourceTag::TileCachePath, mbDefaultTag);
-        xml.append(mbDefaultTag);
-        xml.append("</DefaultValue>\n");
-        xml.append("</ConnectionProperty>\n");
 
         //Property: TileFormat
         xml.append("<ConnectionProperty Enumerable=\"true\" Protected=\"false\" Required=\"true\">\n");
@@ -433,71 +418,24 @@
         xml.append("<Value>UTFGRID</Value>");
         xml.append("</ConnectionProperty>\n");
 
-        //Property: RenderOnly
-        xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"false\">\n");
-        xml.append("<Name>");
-        std::string mbRenderOnly;
-        MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_COMMON_PARAM_RENDERONLY, mbRenderOnly);
-        xml.append(mbRenderOnly);
-        xml.append("</Name>\n");
-        xml.append("<LocalizedName>");
-        std::string mbLocRenderOnly;
-        STRING wLocRenderOnly = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_Common_Property_RenderOnly_LocalizedName");
-        MgUtil::WideCharToMultiByte(wLocRenderOnly, mbLocRenderOnly);
-        xml.append(mbLocRenderOnly);
-        xml.append("</LocalizedName>\n");
-        xml.append("<DefaultValue>false</DefaultValue>\n");
-        xml.append("</ConnectionProperty>\n");
-
-        //Property: TileExtentOffset
+        //Property: RetinaScale
         xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"true\">\n");
         xml.append("<Name>");
-        std::string mbTileExtentOffset;
-        MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_COMMON_PARAM_TILEEXTENTOFFSET, mbTileExtentOffset);
-        xml.append(mbTileExtentOffset);
+        std::string mbRetinaScale;
+        MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_XYZ_PARAM_RETINASCALE, mbRetinaScale);
+        xml.append(mbRetinaScale);
         xml.append("</Name>\n");
         xml.append("<LocalizedName>");
-        std::string mbLocTileExtentOffset;
-        STRING wLocTileExtentOffset = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_Common_Property_TileExtentOffset_LocalizedName");
-        MgUtil::WideCharToMultiByte(wLocTileExtentOffset, mbLocTileExtentOffset);
-        xml.append(mbLocTileExtentOffset);
+        std::string mbLocRetinaScale;
+        STRING wLocRetinaScale = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_XYZ_Property_RetinaScale_LocalizedName");
+        MgUtil::WideCharToMultiByte(wLocRetinaScale, mbLocRetinaScale);
+        xml.append(mbLocRetinaScale);
         xml.append("</LocalizedName>\n");
         xml.append("<DefaultValue></DefaultValue>\n");
         xml.append("</ConnectionProperty>\n");
 
-        //Property: MetaTileFactor
-        xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"true\">\n");
-        xml.append("<Name>");
-        std::string mbMetaTileFactor;
-        MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_COMMON_PARAM_METATILEFACTOR, mbMetaTileFactor);
-        xml.append(mbMetaTileFactor);
-        xml.append("</Name>\n");
-        xml.append("<LocalizedName>");
-        std::string mbLocMetaTileFactor;
-        STRING wLocMetaTileFactor = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_Common_Property_MetaTileFactor_LocalizedName");
-        MgUtil::WideCharToMultiByte(wLocMetaTileFactor, mbLocMetaTileFactor);
-        xml.append(mbLocMetaTileFactor);
-        xml.append("</LocalizedName>\n");
-        xml.append("<DefaultValue></DefaultValue>\n");
-        xml.append("</ConnectionProperty>\n");
+        WriteCommonTileProviderProperties(xml);
 
-        //Property: MetaTileLockMethod
-        xml.append("<ConnectionProperty Enumerable=\"false\" Protected=\"false\" Required=\"true\">\n");
-        xml.append("<Name>");
-        std::string mbMetaTileLockMethod;
-        MgUtil::WideCharToMultiByte(MG_TILE_PROVIDER_COMMON_PARAM_METATILELOCKMETHOD, mbMetaTileLockMethod);
-        xml.append(mbMetaTileLockMethod);
-        xml.append("</Name>\n");
-        xml.append("<LocalizedName>");
-        std::string mbLocMetaTileLockMethod;
-        STRING wLocMetaTileLockMethod = MgUtil::GetResourceMessage(MgResources::TileService, L"MgTileProvider_Common_Property_MetaTileLockMethod_LocalizedName");
-        MgUtil::WideCharToMultiByte(wLocMetaTileLockMethod, mbLocMetaTileLockMethod);
-        xml.append(mbLocMetaTileLockMethod);
-        xml.append("</LocalizedName>\n");
-        xml.append("<DefaultValue></DefaultValue>\n");
-        xml.append("</ConnectionProperty>\n");
-
-
         xml.append("</ConnectionProperties>\n");
         xml.append("</TileProvider>\n");
     }
@@ -668,6 +606,7 @@
         bool bRenderOnly = false;
         INT32 metaTileFactor = 0;
         INT32 metaTileLockMethod = 0;
+        INT32 retinaScale = 1;
         for (INT32 i = 0; i < parameters->GetCount(); i++)
         {
             MdfModel::NameStringPair* pair = parameters->GetAt(i);
@@ -699,6 +638,10 @@
             {
                 metaTileLockMethod = MgUtil::StringToInt32(pair->GetValue());
             }
+            else if (pair->GetName() == MG_TILE_PROVIDER_XYZ_PARAM_RETINASCALE)
+            {
+                retinaScale = MgUtil::StringToInt32(pair->GetValue());
+            }
         }
 
         //If we find the cache path substitution tag, replace it with the default path from the configuration
@@ -707,7 +650,7 @@
             path = MgTileParameters::tileCachePath;
         }
 
-        cache = new MgTileCacheXYZProvider(tileSetId, path, format, bRenderOnly, tileExtentOffset, m_rendererName, metaTileFactor, metaTileLockMethod);
+        cache = new MgTileCacheXYZProvider(tileSetId, path, format, bRenderOnly, tileExtentOffset, m_rendererName, metaTileFactor, metaTileLockMethod, retinaScale);
     }
     else 
     {

Modified: sandbox/jng/tiling_v3/Server/src/Services/Tile/ServerTileService.h
===================================================================
--- sandbox/jng/tiling_v3/Server/src/Services/Tile/ServerTileService.h	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Server/src/Services/Tile/ServerTileService.h	2019-06-07 14:19:52 UTC (rev 9540)
@@ -76,6 +76,8 @@
     void SetConnectionProperties(MgConnectionProperties* connProp);
 
 private:
+    void WriteCommonTileProviderProperties(std::string& xml);
+
     MgTileCache* GetTileCache(MgResourceIdentifier* resource);
     MgTileCache* GetTileCache(MgResourceIdentifier* tileSetId, MdfModel::TileSetDefinition* tileset);
 

Modified: sandbox/jng/tiling_v3/Server/src/Services/Tile/TileCacheXYZProvider.cpp
===================================================================
--- sandbox/jng/tiling_v3/Server/src/Services/Tile/TileCacheXYZProvider.cpp	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Server/src/Services/Tile/TileCacheXYZProvider.cpp	2019-06-07 14:19:52 UTC (rev 9540)
@@ -27,7 +27,8 @@
                                                double tileExtentOffset,
                                                CREFSTRING rendererName,
                                                INT32 metaTileFactor,
-                                               INT32 metaTileLockMethod)
+                                               INT32 metaTileLockMethod,
+                                               INT32 retinaScale)
 {
     m_tilesetId = SAFE_ADDREF(tileSetId);
     m_path = path;
@@ -37,6 +38,7 @@
     m_rendererName = rendererName;
     m_metaTileFactor = metaTileFactor;
     m_metaTileLockMethod = metaTileLockMethod;
+    m_retinaScale = retinaScale;
 }
 
 MgTileCacheXYZProvider::~MgTileCacheXYZProvider()
@@ -44,15 +46,20 @@
 
 }
 
+bool MgTileCacheXYZProvider::IsTileImageFormat()
+{
+    return m_format == L"UTFGRID";
+}
+
 MgByteReader* MgTileCacheXYZProvider::GetTile(CREFSTRING baseMapLayerGroupName,
-                                                  INT32 tileColumn,
-                                                  INT32 tileRow,
-                                                  INT32 scaleIndex)
+                                              INT32 tileColumn,
+                                              INT32 tileRow,
+                                              INT32 scaleIndex)
 {
     Ptr<MgByteReader> ret;
     MG_TRY()
 
-        if (m_metaTileFactor > 1)
+        if (IsTileImageFormat() && m_metaTileFactor > 1)
             ret = GetMetatileForResource(m_tilesetId, baseMapLayerGroupName, tileColumn, tileRow, scaleIndex);
         else
             ret = GetTileForResource(m_tilesetId, baseMapLayerGroupName, tileColumn, tileRow, scaleIndex);
@@ -86,7 +93,7 @@
         else //Assume it must be image-based at this point
         {
             // generate the tile
-            img = svcRendering->RenderTileXYZ(map, baseMapLayerGroupName, tileRow, tileColumn, scaleIndex, map->GetDisplayDpi(), m_format, m_tileExtentOffset);
+            img = svcRendering->RenderTileXYZ(map, baseMapLayerGroupName, tileRow, tileColumn, scaleIndex, map->GetDisplayDpi(), m_format, m_tileExtentOffset, m_retinaScale);
         }
         // cache the tile
         if (!m_renderOnly)
@@ -409,9 +416,8 @@
             serviceMan->RequestService(MgServiceType::RenderingService));
         _ASSERT(NULL != svcRendering);
 
-        //Ptr<MgByteReader> metaTileBitMap = GetTile(metaTileName, map, scaleIndex, baseMapLayerGroupName, metaTileColumn, metaTileRow);
         INT32 tileDpi = map->GetDisplayDpi();
-        Ptr<MgMetatile> metaTile = svcRendering->RenderMetatileXYZ(map, baseMapLayerGroupName, metaTileRow, metaTileColumn, scaleIndex, tileDpi, m_format, m_tileExtentOffset, m_metaTileFactor);
+        Ptr<MgMetatile> metaTile = svcRendering->RenderMetatileXYZ(map, baseMapLayerGroupName, metaTileRow, metaTileColumn, scaleIndex, tileDpi, m_format, m_tileExtentOffset, m_metaTileFactor, m_retinaScale);
 #ifdef _DEBUG
         Ptr<MgByteReader> mtContent = metaTile->GetImage();
         INT32 metaTileLen = mtContent->GetLength();

Modified: sandbox/jng/tiling_v3/Server/src/Services/Tile/TileCacheXYZProvider.h
===================================================================
--- sandbox/jng/tiling_v3/Server/src/Services/Tile/TileCacheXYZProvider.h	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Server/src/Services/Tile/TileCacheXYZProvider.h	2019-06-07 14:19:52 UTC (rev 9540)
@@ -29,7 +29,9 @@
                            double tileExtentOffset,
                            CREFSTRING rendererName,
                            INT32 metaTileFactor,
-                           INT32 metaTileLockMethod);
+                           INT32 metaTileLockMethod,
+                           INT32 retinaScale);
+
     virtual ~MgTileCacheXYZProvider();
 
     virtual MgByteReader* GetTile(CREFSTRING baseMapLayerGroupName,
@@ -60,6 +62,8 @@
     virtual STRING GetTileFileExtension();
 
 private:
+    bool IsTileImageFormat();
+
     // ---------------- Begin Metatile stuff --------------------- //
     MgByteReader* GetMetatileForResource(MgResourceIdentifier* resource,
         CREFSTRING baseMapLayerGroupName,
@@ -79,6 +83,7 @@
     double m_tileExtentOffset;
     INT32 m_metaTileFactor;
     INT32 m_metaTileLockMethod;
+    INT32 m_retinaScale;
 
     STRING m_rendererName;
 };

Modified: sandbox/jng/tiling_v3/Server/src/UnitTesting/TestRenderingService.cpp
===================================================================
--- sandbox/jng/tiling_v3/Server/src/UnitTesting/TestRenderingService.cpp	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Server/src/UnitTesting/TestRenderingService.cpp	2019-06-07 14:19:52 UTC (rev 9540)
@@ -1760,21 +1760,30 @@
     }
 }
 
-void TestRenderingService::TestCase_RenderXYZMetatile(CREFSTRING imageFormat, CREFSTRING extension)
+void TestRenderingService::TestCase_RenderXYZMetatile(CREFSTRING imageFormat, CREFSTRING extension, INT32 retinaScale)
 {
     try
     {
+        STRING retinaSuffix = L"";
+        if (retinaScale > 1)
+        {
+            retinaSuffix = L"@";
+            STRING sRetina;
+            MgUtil::Int32ToString(retinaScale, sRetina);
+            retinaSuffix += sRetina;
+        }
+
         Ptr<MgMap> map = CreateTestTiledMap();
         map->SetViewScale(12500.0);
-        Ptr<MgByteReader> tile_16798_23891_baseline = m_svcRendering->RenderTileXYZ(map, L"BaseLayers", 16798, 23891, 16, MgTileParameters::tileDPI, imageFormat);
-        Ptr<MgByteReader> tile_16799_23891_baseline = m_svcRendering->RenderTileXYZ(map, L"BaseLayers", 16799, 23891, 16, MgTileParameters::tileDPI, imageFormat);
-        Ptr<MgByteReader> tile_16798_23892_baseline = m_svcRendering->RenderTileXYZ(map, L"BaseLayers", 16798, 23892, 16, MgTileParameters::tileDPI, imageFormat);
-        Ptr<MgByteReader> tile_16799_23892_baseline = m_svcRendering->RenderTileXYZ(map, L"BaseLayers", 16799, 23892, 16, MgTileParameters::tileDPI, imageFormat);
+        Ptr<MgByteReader> tile_16798_23891_baseline = m_svcRendering->RenderTileXYZ(map, L"BaseLayers", 16798, 23891, 16, MgTileParameters::tileDPI, imageFormat, MgConfigProperties::DefaultRenderingServicePropertyTileExtentOffset, retinaScale);
+        Ptr<MgByteReader> tile_16799_23891_baseline = m_svcRendering->RenderTileXYZ(map, L"BaseLayers", 16799, 23891, 16, MgTileParameters::tileDPI, imageFormat, MgConfigProperties::DefaultRenderingServicePropertyTileExtentOffset, retinaScale);
+        Ptr<MgByteReader> tile_16798_23892_baseline = m_svcRendering->RenderTileXYZ(map, L"BaseLayers", 16798, 23892, 16, MgTileParameters::tileDPI, imageFormat, MgConfigProperties::DefaultRenderingServicePropertyTileExtentOffset, retinaScale);
+        Ptr<MgByteReader> tile_16799_23892_baseline = m_svcRendering->RenderTileXYZ(map, L"BaseLayers", 16799, 23892, 16, MgTileParameters::tileDPI, imageFormat, MgConfigProperties::DefaultRenderingServicePropertyTileExtentOffset, retinaScale);
 
-        tile_16798_23891_baseline->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16798_23891_16_Baseline", imageFormat, extension));
-        tile_16799_23891_baseline->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16799_23891_16_Baseline", imageFormat, extension));
-        tile_16798_23892_baseline->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16798_23892_16_Baseline", imageFormat, extension));
-        tile_16799_23892_baseline->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16799_23892_16_Baseline", imageFormat, extension));
+        tile_16798_23891_baseline->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16798_23891_16_Baseline" + retinaSuffix, imageFormat, extension));
+        tile_16799_23891_baseline->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16799_23891_16_Baseline" + retinaSuffix, imageFormat, extension));
+        tile_16798_23892_baseline->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16798_23892_16_Baseline" + retinaSuffix, imageFormat, extension));
+        tile_16799_23892_baseline->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16799_23892_16_Baseline" + retinaSuffix, imageFormat, extension));
 
         MgRenderingService* renderSvc = dynamic_cast<MgRenderingService*>(m_svcRendering.p);
         CPPUNIT_ASSERT(NULL != renderSvc);
@@ -1781,7 +1790,7 @@
 
         // Render a 2x2 metatile which should cover the same tiles as the baseline test.
         INT32 metaTileFactor = 2;
-        Ptr<MgMetatile> metaTile = renderSvc->RenderMetatileXYZ(map, L"BaseLayers", 16798, 23891, 16, MgTileParameters::tileDPI, imageFormat, MgConfigProperties::DefaultRenderingServicePropertyTileExtentOffset, metaTileFactor);
+        Ptr<MgMetatile> metaTile = renderSvc->RenderMetatileXYZ(map, L"BaseLayers", 16798, 23891, 16, MgTileParameters::tileDPI, imageFormat, MgConfigProperties::DefaultRenderingServicePropertyTileExtentOffset, metaTileFactor, retinaScale);
         //metaTile->ToFile(L"../UnitTestFiles/RenderTileXYZ_Metatile at 16798_23891_16.png");
         //CPPUNIT_ASSERT(metaTile->IsRewindable());
         //metaTile->Rewind();
@@ -1791,10 +1800,10 @@
         Ptr<MgByteReader> tile_16798_23892 = renderSvc->RenderTileFromMetaTile(map, metaTile, rendererName, 0, 1);
         Ptr<MgByteReader> tile_16799_23892 = renderSvc->RenderTileFromMetaTile(map, metaTile, rendererName, 1, 1);
 
-        tile_16798_23891->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16798_23891_16_Metatiled", imageFormat, extension));
-        tile_16799_23891->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16799_23891_16_Metatiled", imageFormat, extension));
-        tile_16798_23892->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16798_23892_16_Metatiled", imageFormat, extension));
-        tile_16799_23892->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16799_23892_16_Metatiled", imageFormat, extension));
+        tile_16798_23891->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16798_23891_16_Metatiled" + retinaSuffix, imageFormat, extension));
+        tile_16799_23891->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16799_23891_16_Metatiled" + retinaSuffix, imageFormat, extension));
+        tile_16798_23892->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16798_23892_16_Metatiled" + retinaSuffix, imageFormat, extension));
+        tile_16799_23892->ToFile(GetPath(L"../UnitTestFiles/RenderTileXYZ_16799_23892_16_Metatiled" + retinaSuffix, imageFormat, extension));
     }
     catch (MgException* e)
     {

Modified: sandbox/jng/tiling_v3/Server/src/UnitTesting/TestRenderingService.h
===================================================================
--- sandbox/jng/tiling_v3/Server/src/UnitTesting/TestRenderingService.h	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Server/src/UnitTesting/TestRenderingService.h	2019-06-07 14:19:52 UTC (rev 9540)
@@ -29,6 +29,16 @@
     CPPUNIT_TEST(TestCase_RenderXYZMetatilePNG8);
     CPPUNIT_TEST(TestCase_RenderXYZMetatileJPG);
     CPPUNIT_TEST(TestCase_RenderXYZMetatileGIF);
+
+    CPPUNIT_TEST(TestCase_RenderXYZMetatilePNG_2x);
+    CPPUNIT_TEST(TestCase_RenderXYZMetatilePNG8_2x);
+    CPPUNIT_TEST(TestCase_RenderXYZMetatileJPG_2x);
+    CPPUNIT_TEST(TestCase_RenderXYZMetatileGIF_2x);
+
+    CPPUNIT_TEST(TestCase_RenderXYZMetatilePNG_4x);
+    CPPUNIT_TEST(TestCase_RenderXYZMetatilePNG8_4x);
+    CPPUNIT_TEST(TestCase_RenderXYZMetatileJPG_4x);
+    CPPUNIT_TEST(TestCase_RenderXYZMetatileGIF_4x);
     
     CPPUNIT_TEST(TestCase_RenderMetatilePNG);
     CPPUNIT_TEST(TestCase_RenderMetatilePNG8);
@@ -169,7 +179,7 @@
 
     void TestCase_QueryFeatures();
     void TestCase_RenderMetatile(CREFSTRING imageFormat, CREFSTRING extension);
-    void TestCase_RenderXYZMetatile(CREFSTRING imageFormat, CREFSTRING extension);
+    void TestCase_RenderXYZMetatile(CREFSTRING imageFormat, CREFSTRING extension, INT32 retinaScale);
     void TestCase_RenderTile(CREFSTRING imageFormat, CREFSTRING extension);
     void TestCase_RenderTileXYZ(CREFSTRING imageFormat, CREFSTRING extension);
 
@@ -318,11 +328,21 @@
     void TestCase_RenderMetatileJPG() { TestCase_RenderMetatile(L"JPG", L"jpg"); }
     void TestCase_RenderMetatileGIF() { TestCase_RenderMetatile(L"GIF", L"gif"); }
 
-    void TestCase_RenderXYZMetatilePNG() { TestCase_RenderXYZMetatile(L"PNG", L"png"); }
-    void TestCase_RenderXYZMetatilePNG8() { TestCase_RenderXYZMetatile(L"PNG8", L"png"); }
-    void TestCase_RenderXYZMetatileJPG() { TestCase_RenderXYZMetatile(L"JPG", L"jpg"); }
-    void TestCase_RenderXYZMetatileGIF() { TestCase_RenderXYZMetatile(L"GIF", L"gif"); }
+    void TestCase_RenderXYZMetatilePNG() { TestCase_RenderXYZMetatile(L"PNG", L"png", 1); }
+    void TestCase_RenderXYZMetatilePNG8() { TestCase_RenderXYZMetatile(L"PNG8", L"png", 1); }
+    void TestCase_RenderXYZMetatileJPG() { TestCase_RenderXYZMetatile(L"JPG", L"jpg", 1); }
+    void TestCase_RenderXYZMetatileGIF() { TestCase_RenderXYZMetatile(L"GIF", L"gif", 1); }
 
+    void TestCase_RenderXYZMetatilePNG_2x() { TestCase_RenderXYZMetatile(L"PNG", L"png", 2); }
+    void TestCase_RenderXYZMetatilePNG8_2x() { TestCase_RenderXYZMetatile(L"PNG8", L"png", 2); }
+    void TestCase_RenderXYZMetatileJPG_2x() { TestCase_RenderXYZMetatile(L"JPG", L"jpg", 2); }
+    void TestCase_RenderXYZMetatileGIF_2x() { TestCase_RenderXYZMetatile(L"GIF", L"gif", 2); }
+
+    void TestCase_RenderXYZMetatilePNG_4x() { TestCase_RenderXYZMetatile(L"PNG", L"png", 4); }
+    void TestCase_RenderXYZMetatilePNG8_4x() { TestCase_RenderXYZMetatile(L"PNG8", L"png", 4); }
+    void TestCase_RenderXYZMetatileJPG_4x() { TestCase_RenderXYZMetatile(L"JPG", L"jpg", 4); }
+    void TestCase_RenderXYZMetatileGIF_4x() { TestCase_RenderXYZMetatile(L"GIF", L"gif", 4); }
+
 private:
     MgMap* CreateTestMap();
     MgMap* CreateTestTiledMap();

Modified: sandbox/jng/tiling_v3/Server/src/UnitTesting/TestTileService.cpp
===================================================================
--- sandbox/jng/tiling_v3/Server/src/UnitTesting/TestTileService.cpp	2019-06-07 12:03:17 UTC (rev 9539)
+++ sandbox/jng/tiling_v3/Server/src/UnitTesting/TestTileService.cpp	2019-06-07 14:19:52 UTC (rev 9540)
@@ -1860,7 +1860,7 @@
         INT32 mtX = y;
         INT32 mtY = x;
 
-        Ptr<MgMetatile> metaTile = renderSvc->RenderMetatileXYZ(map, L"BaseLayers", mtX, mtY, z, MgTileParameters::tileDPI, MgImageFormats::Png, MgConfigProperties::DefaultRenderingServicePropertyTileExtentOffset, metaTileFactor);
+        Ptr<MgMetatile> metaTile = renderSvc->RenderMetatileXYZ(map, L"BaseLayers", mtX, mtY, z, MgTileParameters::tileDPI, MgImageFormats::Png, MgConfigProperties::DefaultRenderingServicePropertyTileExtentOffset, metaTileFactor, 1 /* retinaScale */);
         Ptr<MgByteReader> mtContent = metaTile->GetImage();
         INT64 metaTileLen = mtContent->GetLength();
         INT32 mtFactor = metaTile->GetMetaTilingFactor();



More information about the mapguide-commits mailing list