[mapguide-commits] r5436 - trunk/MgDev/Common/Stylization

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Fri Dec 3 13:20:44 EST 2010


Author: traianstanev
Date: 2010-12-03 10:20:44 -0800 (Fri, 03 Dec 2010)
New Revision: 5436

Modified:
   trunk/MgDev/Common/Stylization/LineBuffer.cpp
   trunk/MgDev/Common/Stylization/LineBuffer.h
Log:
Fixed two bugs which were causing crashes when round-tripping data with To/FromAgf().

One was that MultiLineStrings were serialized incorrectly (number of geometries was not correctly set).

The second was that m_dimensionality was blindly set to what comes in with an AGF stream, which sometimes may contain M values. During serialization, this dimensionality value was written back to the output stream, but no M values were written since LineBuffer does not support those. This fix was to remove the M flag from m_dimensionality.

Also changed some FdoDimensionality types to int, to reduce the API dependency on FDO types, but this is just a small part of a larger job.

Modified: trunk/MgDev/Common/Stylization/LineBuffer.cpp
===================================================================
--- trunk/MgDev/Common/Stylization/LineBuffer.cpp	2010-12-03 12:53:35 UTC (rev 5435)
+++ trunk/MgDev/Common/Stylization/LineBuffer.cpp	2010-12-03 18:20:44 UTC (rev 5436)
@@ -41,7 +41,7 @@
 
 #define MAX_POINT_BLOCK 128
 
-LineBuffer::LineBuffer(int size, FdoDimensionality dimensionality, bool bIgnoreZ) :
+LineBuffer::LineBuffer(int size, int dimensionality, bool bIgnoreZ) :
     m_bounds(DBL_MAX, DBL_MAX, DBL_MAX, -DBL_MAX, -DBL_MAX, -DBL_MAX),
     m_types(NULL),
     m_types_len(0),
@@ -116,7 +116,7 @@
 }
 
 
-void LineBuffer::Reset(FdoDimensionality dimensionality, bool bIgnoreZ)
+void LineBuffer::Reset(int dimensionality, bool bIgnoreZ)
 {
     m_cur_types = 0;
     m_cur_cntr = -1; // will increment with first MoveTo segment
@@ -911,7 +911,7 @@
                 // ensure that all dimensionalities of each geometry are the same
                 _ASSERT(q==0 || m_dimensionality == dim);
 
-                m_dimensionality = dim;
+                m_dimensionality = dim & ~FdoDimensionality_M; //LineBuffer doesn't support M
                 m_bProcessZ = (m_dimensionality & FdoDimensionality_Z) && !m_bIgnoreZ;
 
                 skip = 0;
@@ -1207,9 +1207,10 @@
             int num_geoms = m_cur_geom + 1;
             if (is_multi)
             {
-                if (m_geom_type == FdoGeometryType_MultiPoint)
+                if (   m_geom_type == FdoGeometryType_MultiPoint 
+                    || m_geom_type == FdoGeometryType_MultiLineString )
                 {
-                    //write number of geometries -- for multipoint the
+                    //write number of geometries -- for multipoint/linestring the
                     //number of contours (i.e. MoveTos) is equal to the
                     //number of point geometries in the multipoint
                     WRITE_INT(os, m_num_geomcntrs[0]);
@@ -1465,7 +1466,7 @@
         || m_bounds.maxy < b.miny)
         return NULL;
 
-    std::auto_ptr<LineBuffer> spLB(LineBufferPool::NewLineBuffer(lbp, m_cur_types, m_dimensionality, m_bIgnoreZ));
+    std::auto_ptr<LineBuffer> spLB(LineBufferPool::NewLineBuffer(lbp, m_cur_types, (FdoDimensionality)m_dimensionality, m_bIgnoreZ));
 
     if (clipType == ctArea)
     {
@@ -2543,7 +2544,7 @@
 
 FdoDimensionality LineBuffer::dimensionality()
 {
-    return m_dimensionality;
+    return (FdoDimensionality)m_dimensionality;
 }
 
 
@@ -2604,7 +2605,7 @@
 }
 
 
-LineBuffer* LineBufferPool::NewLineBuffer(LineBufferPool* pool, int requestSize, FdoDimensionality dimensionality, bool bIgnoreZ)
+LineBuffer* LineBufferPool::NewLineBuffer(LineBufferPool* pool, int requestSize, int dimensionality, bool bIgnoreZ)
 {
     if (pool && !pool->m_pool.empty())
     {

Modified: trunk/MgDev/Common/Stylization/LineBuffer.h
===================================================================
--- trunk/MgDev/Common/Stylization/LineBuffer.h	2010-12-03 12:53:35 UTC (rev 5435)
+++ trunk/MgDev/Common/Stylization/LineBuffer.h	2010-12-03 18:20:44 UTC (rev 5436)
@@ -90,7 +90,7 @@
         ctAGF   = 4
     };
 
-    STYLIZATION_API LineBuffer(int size, FdoDimensionality dimensionality = FdoDimensionality_XY, bool bIgnoreZ = true);
+    STYLIZATION_API LineBuffer(int size, int dimensionality = FdoDimensionality_XY, bool bIgnoreZ = true);
     STYLIZATION_API virtual ~LineBuffer();
 
     // rudimentary stuff
@@ -120,7 +120,7 @@
     STYLIZATION_API void Centroid(GeomOperationType type, double* x, double * y, double* slope) const;
 
     // clears the buffer for reuse
-    STYLIZATION_API void Reset(FdoDimensionality dimensionality = FdoDimensionality_XY, bool bIgnoreZ = true);
+    STYLIZATION_API void Reset(int dimensionality = FdoDimensionality_XY, bool bIgnoreZ = true);
     STYLIZATION_API void SetGeometryType(int geomType);
 
     // computes the bounds of the line buffer's geometry
@@ -211,7 +211,7 @@
     int m_cur_geom;
     bool m_bIgnoreZ;
     bool m_bProcessZ;
-    FdoDimensionality m_dimensionality;
+    int m_dimensionality;
     double m_drawingScale;
     int m_arcs_sp_len;          // length of m_arcs_sp array
     int m_cur_arcs_sp;          // current index into m_arcs_sp
@@ -266,7 +266,7 @@
     STYLIZATION_API LineBufferPool();
     STYLIZATION_API virtual ~LineBufferPool();
 
-    STYLIZATION_API static LineBuffer* NewLineBuffer(LineBufferPool* pool, int requestSize, FdoDimensionality dimensionality = FdoDimensionality_XY, bool bIgnoreZ = true);
+    STYLIZATION_API static LineBuffer* NewLineBuffer(LineBufferPool* pool, int requestSize, int dimensionality = FdoDimensionality_XY, bool bIgnoreZ = true);
     STYLIZATION_API static void FreeLineBuffer(LineBufferPool* pool, LineBuffer* lb);
 
 private:



More information about the mapguide-commits mailing list