[mapguide-commits] r6149 - in trunk/MgDev/Common: Renderers Stylization

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Mon Sep 26 23:47:36 EDT 2011


Author: waltweltonlair
Date: 2011-09-26 20:47:36 -0700 (Mon, 26 Sep 2011)
New Revision: 6149

Modified:
   trunk/MgDev/Common/Renderers/DWFRenderer.cpp
   trunk/MgDev/Common/Stylization/LabelRenderer.cpp
   trunk/MgDev/Common/Stylization/LabelRendererLocal.cpp
   trunk/MgDev/Common/Stylization/SE_PositioningAlgorithms.cpp
   trunk/MgDev/Common/Stylization/SE_RenderProxies.h
Log:
Fix stylization memory leak

SE_RenderStyle objects were getting leaked in the case where you selected features
which had labels based on enhanced stylization.

Stylizing a label involves the following:
  * clone the SE_RenderStyle used for the label
  * put the cloned style into an SE_LabelInfo object
  * call SE_Renderer:ProcessSELabelGroup with the SE_LabelInfo
During regular rendering the label renderer takes ownership of the cloned style and
eventually deletes it.  But during selection rendering the label renderer is not
invoked, and therefore the cloned style is leaked.

To fix this I added a destructor to SE_LabelInfo which deletes any referenced style.
In the selection rendering case the destructor will now automatically delete the
style.  In the regular rendering case the label renderer still takes ownership of
the cloned style, and so we simply clear the 'style' member variable in SE_LabelInfo
to prevent the destructor from deleting it.


Modified: trunk/MgDev/Common/Renderers/DWFRenderer.cpp
===================================================================
--- trunk/MgDev/Common/Renderers/DWFRenderer.cpp	2011-09-27 02:37:20 UTC (rev 6148)
+++ trunk/MgDev/Common/Renderers/DWFRenderer.cpp	2011-09-27 03:47:36 UTC (rev 6149)
@@ -2860,7 +2860,7 @@
         BeginMacro(file, i+1, scale);
 
             m_w2dActive = file;
-            DrawSymbol(info->symbol->symbol, m, info->anglerad);
+            DrawSymbol(info->style->symbol, m, info->anglerad);
             m_w2dActive = NULL;
 
         EndMacro(file, i+1);

Modified: trunk/MgDev/Common/Stylization/LabelRenderer.cpp
===================================================================
--- trunk/MgDev/Common/Stylization/LabelRenderer.cpp	2011-09-27 02:37:20 UTC (rev 6148)
+++ trunk/MgDev/Common/Stylization/LabelRenderer.cpp	2011-09-27 03:47:36 UTC (rev 6149)
@@ -194,12 +194,15 @@
         SE_LabelInfo* info = &labels[i];
 
         // label is in device space
-        LabelInfo lrinfo(info->x, info->y, info->symbol);
+        LabelInfo lrinfo(info->x, info->y, info->style);
 
         // TODO: HACK -- well somewhat of a hack -- store the angle in the tdef
         lrinfo.m_tdef.rotation() = info->anglerad * M_180PI;
 
         m_labelGroups.back().m_labels.push_back(lrinfo);
+
+        // label renderer now owns the cloned render style
+        info->style = NULL;
     }
 
     EndOverpostGroup();

Modified: trunk/MgDev/Common/Stylization/LabelRendererLocal.cpp
===================================================================
--- trunk/MgDev/Common/Stylization/LabelRendererLocal.cpp	2011-09-27 02:37:20 UTC (rev 6148)
+++ trunk/MgDev/Common/Stylization/LabelRendererLocal.cpp	2011-09-27 03:47:36 UTC (rev 6149)
@@ -339,12 +339,15 @@
         SE_LabelInfo* info = &labels[i];
 
         // label is in device space
-        LabelInfoLocal lrinfo(info->x, info->y, info->symbol);
+        LabelInfoLocal lrinfo(info->x, info->y, info->style);
 
         // TODO: HACK -- well somewhat of a hack -- store the angle in the tdef
         lrinfo.m_tdef.rotation() = info->anglerad * M_180PI;
 
         m_labelGroups.back().m_labels.push_back(lrinfo);
+
+        // label renderer now owns the cloned render style
+        info->style = NULL;
     }
 
     // remember the feature bounds for the label group

Modified: trunk/MgDev/Common/Stylization/SE_PositioningAlgorithms.cpp
===================================================================
--- trunk/MgDev/Common/Stylization/SE_PositioningAlgorithms.cpp	2011-09-27 02:37:20 UTC (rev 6148)
+++ trunk/MgDev/Common/Stylization/SE_PositioningAlgorithms.cpp	2011-09-27 03:47:36 UTC (rev 6149)
@@ -369,42 +369,42 @@
         ((SE_RenderText*)st0->symbol[0])->tdef.halign() = RS_HAlignment_Left;
         ((SE_RenderText*)st0->symbol[0])->tdef.valign() = RS_VAlignment_Half;
         UpdateStyleBounds(st0, se_renderer);
-        candidates[0] = SE_LabelInfo(cx + op_pts[ 0], cy + op_pts[ 1]*yScale, RS_Units_Device, angleRad, st0);
+        candidates[0].Set(cx + op_pts[ 0], cy + op_pts[ 1]*yScale, RS_Units_Device, angleRad, st0);
 
         SE_RenderStyle* st1 = se_renderer->CloneRenderStyle(st0);
         ((SE_RenderText*)st1->symbol[0])->tdef.valign() = RS_VAlignment_Descent;
         UpdateStyleBounds(st1, se_renderer);
-        candidates[1] = SE_LabelInfo(cx + op_pts[ 2], cy + op_pts[ 3]*yScale, RS_Units_Device, angleRad, st1);
+        candidates[1].Set(cx + op_pts[ 2], cy + op_pts[ 3]*yScale, RS_Units_Device, angleRad, st1);
 
         SE_RenderStyle* st2 = se_renderer->CloneRenderStyle(st1);
         ((SE_RenderText*)st2->symbol[0])->tdef.halign() = RS_HAlignment_Center;
         UpdateStyleBounds(st2, se_renderer);
-        candidates[2] = SE_LabelInfo(cx + op_pts[ 4], cy + op_pts[ 5]*yScale, RS_Units_Device, angleRad, st2);
+        candidates[2].Set(cx + op_pts[ 4], cy + op_pts[ 5]*yScale, RS_Units_Device, angleRad, st2);
 
         SE_RenderStyle* st3 = se_renderer->CloneRenderStyle(st2);
         ((SE_RenderText*)st3->symbol[0])->tdef.halign() = RS_HAlignment_Right;
         UpdateStyleBounds(st3, se_renderer);
-        candidates[3] = SE_LabelInfo(cx + op_pts[ 6], cy + op_pts[ 7]*yScale, RS_Units_Device, angleRad, st3);
+        candidates[3].Set(cx + op_pts[ 6], cy + op_pts[ 7]*yScale, RS_Units_Device, angleRad, st3);
 
         SE_RenderStyle* st4 = se_renderer->CloneRenderStyle(st3);
         ((SE_RenderText*)st4->symbol[0])->tdef.valign() = RS_VAlignment_Half;
         UpdateStyleBounds(st4, se_renderer);
-        candidates[4] = SE_LabelInfo(cx + op_pts[ 8], cy + op_pts[ 9]*yScale, RS_Units_Device, angleRad, st4);
+        candidates[4].Set(cx + op_pts[ 8], cy + op_pts[ 9]*yScale, RS_Units_Device, angleRad, st4);
 
         SE_RenderStyle* st5 = se_renderer->CloneRenderStyle(st4);
         ((SE_RenderText*)st5->symbol[0])->tdef.valign() = RS_VAlignment_Ascent;
         UpdateStyleBounds(st5, se_renderer);
-        candidates[5] = SE_LabelInfo(cx + op_pts[10], cy + op_pts[11]*yScale, RS_Units_Device, angleRad, st5);
+        candidates[5].Set(cx + op_pts[10], cy + op_pts[11]*yScale, RS_Units_Device, angleRad, st5);
 
         SE_RenderStyle* st6 = se_renderer->CloneRenderStyle(st5);
         ((SE_RenderText*)st6->symbol[0])->tdef.halign() = RS_HAlignment_Center;
         UpdateStyleBounds(st6, se_renderer);
-        candidates[6] = SE_LabelInfo(cx + op_pts[12], cy + op_pts[13]*yScale, RS_Units_Device, angleRad, st6);
+        candidates[6].Set(cx + op_pts[12], cy + op_pts[13]*yScale, RS_Units_Device, angleRad, st6);
 
         SE_RenderStyle* st7 = se_renderer->CloneRenderStyle(st6);
         ((SE_RenderText*)st7->symbol[0])->tdef.halign() = RS_HAlignment_Left;
         UpdateStyleBounds(st7, se_renderer);
-        candidates[7] = SE_LabelInfo(cx + op_pts[14], cy + op_pts[15]*yScale, RS_Units_Device, angleRad, st7);
+        candidates[7].Set(cx + op_pts[14], cy + op_pts[15]*yScale, RS_Units_Device, angleRad, st7);
     }
     else
     {
@@ -421,28 +421,28 @@
         double labelCtrY = 0.5*(labelMinY + labelMaxY);
 
         SE_RenderStyle* st0 = se_renderer->CloneRenderStyle(rpstyle);
-        candidates[0] = SE_LabelInfo(cx + op_pts[ 0] - labelMinX, cy + (op_pts[ 1] - labelCtrY)*yScale, RS_Units_Device, angleRad, st0);
+        candidates[0].Set(cx + op_pts[ 0] - labelMinX, cy + (op_pts[ 1] - labelCtrY)*yScale, RS_Units_Device, angleRad, st0);
 
         SE_RenderStyle* st1 = se_renderer->CloneRenderStyle(st0);
-        candidates[1] = SE_LabelInfo(cx + op_pts[ 2] - labelMinX, cy + (op_pts[ 3] - labelMinY)*yScale, RS_Units_Device, angleRad, st1);
+        candidates[1].Set(cx + op_pts[ 2] - labelMinX, cy + (op_pts[ 3] - labelMinY)*yScale, RS_Units_Device, angleRad, st1);
 
         SE_RenderStyle* st2 = se_renderer->CloneRenderStyle(st1);
-        candidates[2] = SE_LabelInfo(cx + op_pts[ 4] - labelCtrX, cy + (op_pts[ 5] - labelMinY)*yScale, RS_Units_Device, angleRad, st2);
+        candidates[2].Set(cx + op_pts[ 4] - labelCtrX, cy + (op_pts[ 5] - labelMinY)*yScale, RS_Units_Device, angleRad, st2);
 
         SE_RenderStyle* st3 = se_renderer->CloneRenderStyle(st2);
-        candidates[3] = SE_LabelInfo(cx + op_pts[ 6] - labelMaxX, cy + (op_pts[ 7] - labelMinY)*yScale, RS_Units_Device, angleRad, st3);
+        candidates[3].Set(cx + op_pts[ 6] - labelMaxX, cy + (op_pts[ 7] - labelMinY)*yScale, RS_Units_Device, angleRad, st3);
 
         SE_RenderStyle* st4 = se_renderer->CloneRenderStyle(st3);
-        candidates[4] = SE_LabelInfo(cx + op_pts[ 8] - labelMaxX, cy + (op_pts[ 9] - labelCtrY)*yScale, RS_Units_Device, angleRad, st4);
+        candidates[4].Set(cx + op_pts[ 8] - labelMaxX, cy + (op_pts[ 9] - labelCtrY)*yScale, RS_Units_Device, angleRad, st4);
 
         SE_RenderStyle* st5 = se_renderer->CloneRenderStyle(st4);
-        candidates[5] = SE_LabelInfo(cx + op_pts[10] - labelMaxX, cy + (op_pts[11] - labelMaxY)*yScale, RS_Units_Device, angleRad, st5);
+        candidates[5].Set(cx + op_pts[10] - labelMaxX, cy + (op_pts[11] - labelMaxY)*yScale, RS_Units_Device, angleRad, st5);
 
         SE_RenderStyle* st6 = se_renderer->CloneRenderStyle(st5);
-        candidates[6] = SE_LabelInfo(cx + op_pts[12] - labelCtrX, cy + (op_pts[13] - labelMaxY)*yScale, RS_Units_Device, angleRad, st6);
+        candidates[6].Set(cx + op_pts[12] - labelCtrX, cy + (op_pts[13] - labelMaxY)*yScale, RS_Units_Device, angleRad, st6);
 
         SE_RenderStyle* st7 = se_renderer->CloneRenderStyle(st6);
-        candidates[7] = SE_LabelInfo(cx + op_pts[14] - labelMinX, cy + (op_pts[15] - labelMaxY)*yScale, RS_Units_Device, angleRad, st7);
+        candidates[7].Set(cx + op_pts[14] - labelMinX, cy + (op_pts[15] - labelMaxY)*yScale, RS_Units_Device, angleRad, st7);
     }
 
     se_renderer->ProcessSELabelGroup(candidates, 8, RS_OverpostType_FirstFit, true, NULL);

Modified: trunk/MgDev/Common/Stylization/SE_RenderProxies.h
===================================================================
--- trunk/MgDev/Common/Stylization/SE_RenderProxies.h	2011-09-27 02:37:20 UTC (rev 6148)
+++ trunk/MgDev/Common/Stylization/SE_RenderProxies.h	2011-09-27 03:47:36 UTC (rev 6149)
@@ -292,22 +292,36 @@
           y(0.0),
           anglerad(0.0),
           dunits(RS_Units_Device),
-          symbol(NULL)
+          style(NULL)
     {}
 
-    SE_INLINE SE_LabelInfo(double _x, double _y, RS_Units _dunits, double _anglerad, SE_RenderStyle* _symbol)
+    SE_INLINE SE_LabelInfo(double _x, double _y, RS_Units _dunits, double _anglerad, SE_RenderStyle* _style)
         : x(_x),
           y(_y),
           anglerad(_anglerad),
           dunits(_dunits),
-          symbol(_symbol)
+          style(_style)
     {}
 
+    SE_INLINE void Set(double _x, double _y, RS_Units _dunits, double _anglerad, SE_RenderStyle* _style)
+    {
+        x = _x;
+        y = _y;
+        anglerad = _anglerad;
+        dunits = _dunits;
+        style = _style;
+    }
+
+    ~SE_LabelInfo()
+    {
+        delete style;
+    }
+
     double x;
     double y;
     double anglerad; // radians CCW
     RS_Units dunits;
-    SE_RenderStyle* symbol;
+    SE_RenderStyle* style;
 };
 
 #endif



More information about the mapguide-commits mailing list