[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