3636
3737const unsigned char * QgsFeatureRendererV2::_getPoint ( QPointF& pt, QgsRenderContext& context, const unsigned char * wkb )
3838{
39- wkb++; // jump over endian info
40- unsigned int wkbType = *(( int * ) wkb ) ;
41- wkb += sizeof ( unsigned int ) ;
39+ QgsConstWkbPtr wkbPtr ( wkb + 1 );
40+ unsigned int wkbType;
41+ wkbPtr >> wkbType ;
4242
43- double x = *(( double * ) wkb ); wkb += sizeof ( double ) ;
44- double y = *(( double * ) wkb ); wkb += sizeof ( double ) ;
43+ double x, y ;
44+ wkbPtr >> x >> y ;
4545
4646 if ( wkbType == QGis::WKBPolygon25D )
47- wkb += sizeof ( double );
47+ wkbPtr += sizeof ( double );
4848
4949 if ( context.coordinateTransform () )
5050 {
@@ -55,22 +55,17 @@ const unsigned char* QgsFeatureRendererV2::_getPoint( QPointF& pt, QgsRenderCont
5555 context.mapToPixel ().transformInPlace ( x, y );
5656
5757 pt = QPointF ( x, y );
58- return wkb ;
58+ return wkbPtr ;
5959}
6060
6161const unsigned char * QgsFeatureRendererV2::_getLineString ( QPolygonF& pts, QgsRenderContext& context, const unsigned char * wkb )
6262{
63- wkb++; // jump over endian info
64- unsigned int wkbType = *(( int * ) wkb );
65- wkb += sizeof ( unsigned int );
66- unsigned int nPoints = *(( int * ) wkb );
67- wkb += sizeof ( unsigned int );
63+ QgsConstWkbPtr wkbPtr ( wkb );
64+ unsigned int wkbType, nPoints;
65+ wkbPtr >> wkbType >> nPoints;
6866
6967 bool hasZValue = ( wkbType == QGis::WKBLineString25D );
7068
71- int sizeOfDoubleX = sizeof ( double );
72- int sizeOfDoubleY = hasZValue ? 2 * sizeof ( double ) : sizeof ( double );
73-
7469 double x, y;
7570 const QgsCoordinateTransform* ct = context.coordinateTransform ();
7671 const QgsMapToPixel& mtp = context.mapToPixel ();
@@ -81,7 +76,7 @@ const unsigned char* QgsFeatureRendererV2::_getLineString( QPolygonF& pts, QgsRe
8176 const QgsRectangle& e = context.extent ();
8277 double cw = e.width () / 10 ; double ch = e.height () / 10 ;
8378 QgsRectangle clipRect ( e.xMinimum () - cw, e.yMinimum () - ch, e.xMaximum () + cw, e.yMaximum () + ch );
84- wkb = QgsClipper::clippedLineWKB ( wkb - ( 2 * sizeof ( unsigned int ) + 1 ) , clipRect, pts );
79+ wkbPtr = QgsConstWkbPtr ( QgsClipper::clippedLineWKB ( wkb, clipRect, pts ) );
8580 }
8681 else
8782 {
@@ -90,8 +85,9 @@ const unsigned char* QgsFeatureRendererV2::_getLineString( QPolygonF& pts, QgsRe
9085 QPointF* ptr = pts.data ();
9186 for ( unsigned int i = 0 ; i < nPoints; ++i, ++ptr )
9287 {
93- memcpy ( &x, wkb, sizeof ( double ) ); wkb += sizeOfDoubleX;
94- memcpy ( &y, wkb, sizeof ( double ) ); wkb += sizeOfDoubleY;
88+ wkbPtr >> x >> y;
89+ if ( hasZValue )
90+ wkbPtr += sizeof ( double );
9591
9692 *ptr = QPointF ( x, y );
9793 }
@@ -109,26 +105,21 @@ const unsigned char* QgsFeatureRendererV2::_getLineString( QPolygonF& pts, QgsRe
109105 mtp.transformInPlace ( ptr->rx (), ptr->ry () );
110106 }
111107
112-
113- return wkb;
108+ return wkbPtr;
114109}
115110
116111const unsigned char * QgsFeatureRendererV2::_getPolygon ( QPolygonF& pts, QList<QPolygonF>& holes, QgsRenderContext& context, const unsigned char * wkb )
117112{
118- wkb++; // jump over endian info
119- unsigned int wkbType = *(( int * ) wkb );
120- wkb += sizeof ( unsigned int ); // jump over wkb type
121- unsigned int numRings = *(( int * ) wkb );
122- wkb += sizeof ( unsigned int );
113+ QgsConstWkbPtr wkbPtr ( wkb + 1 );
114+
115+ unsigned int wkbType, numRings;
116+ wkbPtr >> wkbType >> numRings;
123117
124118 if ( numRings == 0 ) // sanity check for zero rings in polygon
125- return wkb ;
119+ return wkbPtr ;
126120
127121 bool hasZValue = ( wkbType == QGis::WKBPolygon25D );
128122
129- int sizeOfDoubleX = sizeof ( double );
130- int sizeOfDoubleY = hasZValue ? 2 * sizeof ( double ) : sizeof ( double );
131-
132123 double x, y;
133124 holes.clear ();
134125
@@ -140,17 +131,18 @@ const unsigned char* QgsFeatureRendererV2::_getPolygon( QPolygonF& pts, QList<QP
140131
141132 for ( unsigned int idx = 0 ; idx < numRings; idx++ )
142133 {
143- unsigned int nPoints = *(( int * )wkb ) ;
144- wkb += sizeof ( unsigned int ) ;
134+ unsigned int nPoints;
135+ wkbPtr >> nPoints ;
145136
146137 QPolygonF poly ( nPoints );
147138
148139 // Extract the points from the WKB and store in a pair of vectors.
149140 QPointF* ptr = poly.data ();
150141 for ( unsigned int jdx = 0 ; jdx < nPoints; ++jdx, ++ptr )
151142 {
152- memcpy ( &x, wkb, sizeof ( double ) ); wkb += sizeOfDoubleX;
153- memcpy ( &y, wkb, sizeof ( double ) ); wkb += sizeOfDoubleY;
143+ wkbPtr >> x >> y;
144+ if ( hasZValue )
145+ wkbPtr += sizeof ( double );
154146
155147 *ptr = QPointF ( x, y );
156148 }
@@ -181,7 +173,7 @@ const unsigned char* QgsFeatureRendererV2::_getPolygon( QPolygonF& pts, QList<QP
181173 holes.append ( poly );
182174 }
183175
184- return wkb ;
176+ return wkbPtr ;
185177}
186178
187179void QgsFeatureRendererV2::setScaleMethodToSymbol ( QgsSymbolV2* symbol, int scaleMethod )
@@ -296,14 +288,15 @@ void QgsFeatureRendererV2::renderFeatureWithSymbol( QgsFeature& feature, QgsSymb
296288 break ;
297289 }
298290
299- const unsigned char * wkb = geom->asWkb ();
300- unsigned int num = *(( int * )( wkb + 5 ) );
301- const unsigned char * ptr = wkb + 9 ;
291+ QgsConstWkbPtr wkbPtr ( geom->asWkb () + 5 );
292+ unsigned int num;
293+ wkbPtr >> num;
294+ const unsigned char * ptr = wkbPtr;
302295 QPointF pt;
303296
304297 for ( unsigned int i = 0 ; i < num; ++i )
305298 {
306- ptr = _getPoint ( pt, context, ptr );
299+ ptr = QgsConstWkbPtr ( _getPoint ( pt, context, ptr ) );
307300 (( QgsMarkerSymbolV2* )symbol )->renderPoint ( pt, &feature, context, layer, selected );
308301
309302 // if ( drawVertexMarker )
@@ -321,14 +314,15 @@ void QgsFeatureRendererV2::renderFeatureWithSymbol( QgsFeature& feature, QgsSymb
321314 break ;
322315 }
323316
324- const unsigned char * wkb = geom->asWkb ();
325- unsigned int num = *(( int * )( wkb + 5 ) );
326- const unsigned char * ptr = wkb + 9 ;
317+ QgsConstWkbPtr wkbPtr ( geom->asWkb () + 5 );
318+ unsigned int num;
319+ wkbPtr >> num;
320+ const unsigned char * ptr = wkbPtr;
327321 QPolygonF pts;
328322
329323 for ( unsigned int i = 0 ; i < num; ++i )
330324 {
331- ptr = _getLineString ( pts, context, ptr );
325+ ptr = QgsConstWkbPtr ( _getLineString ( pts, context, ptr ) );
332326 (( QgsLineSymbolV2* )symbol )->renderPolyline ( pts, &feature, context, layer, selected );
333327
334328 if ( drawVertexMarker )
@@ -346,9 +340,10 @@ void QgsFeatureRendererV2::renderFeatureWithSymbol( QgsFeature& feature, QgsSymb
346340 break ;
347341 }
348342
349- const unsigned char * wkb = geom->asWkb ();
350- unsigned int num = *(( int * )( wkb + 5 ) );
351- const unsigned char * ptr = wkb + 9 ;
343+ QgsConstWkbPtr wkbPtr ( geom->asWkb () + 5 );
344+ unsigned int num;
345+ wkbPtr >> num;
346+ const unsigned char * ptr = wkbPtr;
352347 QPolygonF pts;
353348 QList<QPolygonF> holes;
354349
0 commit comments