Skip to content

Commit b5e9547

Browse files
committed
Fix memory alignment issues on ARM
1 parent ae08c3e commit b5e9547

File tree

2 files changed

+53
-58
lines changed

2 files changed

+53
-58
lines changed

src/core/qgsclipper.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
***************************************************************************/
1818

1919
#include "qgsclipper.h"
20+
#include "qgsgeometry.h"
2021

2122
// Where has all the code gone?
2223

@@ -37,16 +38,13 @@ const double QgsClipper::SMALL_NUM = 1e-12;
3738

3839
const unsigned char* QgsClipper::clippedLineWKB( const unsigned char* wkb, const QgsRectangle& clipExtent, QPolygonF& line )
3940
{
40-
wkb++; // jump over endian info
41-
unsigned int wkbType = *(( int* ) wkb );
42-
wkb += sizeof( unsigned int );
43-
unsigned int nPoints = *(( int* ) wkb );
44-
wkb += sizeof( unsigned int );
41+
QgsConstWkbPtr wkbPtr( wkb + 1 );
4542

46-
bool hasZValue = ( wkbType == QGis::WKBLineString25D );
43+
unsigned int wkbType, nPoints;
44+
45+
wkbPtr >> wkbType >> nPoints;
4746

48-
int sizeOfDoubleX = sizeof( double );
49-
int sizeOfDoubleY = hasZValue ? 2 * sizeof( double ) : sizeof( double );
47+
bool hasZValue = ( wkbType == QGis::WKBLineString25D );
5048

5149
double p0x, p0y, p1x = 0.0, p1y = 0.0; //original coordinates
5250
double p1x_c, p1y_c; //clipped end coordinates
@@ -59,8 +57,9 @@ const unsigned char* QgsClipper::clippedLineWKB( const unsigned char* wkb, const
5957
{
6058
if ( i == 0 )
6159
{
62-
memcpy( &p1x, wkb, sizeof( double ) ); wkb += sizeOfDoubleX;
63-
memcpy( &p1y, wkb, sizeof( double ) ); wkb += sizeOfDoubleY;
60+
wkbPtr >> p1x >> p1y;
61+
if ( hasZValue )
62+
wkbPtr += sizeof( double );
6463

6564
continue;
6665
}
@@ -69,8 +68,9 @@ const unsigned char* QgsClipper::clippedLineWKB( const unsigned char* wkb, const
6968
p0x = p1x;
7069
p0y = p1y;
7170

72-
memcpy( &p1x, wkb, sizeof( double ) ); wkb += sizeOfDoubleX;
73-
memcpy( &p1y, wkb, sizeof( double ) ); wkb += sizeOfDoubleY;
71+
wkbPtr >> p1x >> p1y;
72+
if ( hasZValue )
73+
wkbPtr += sizeof( double );
7474

7575
p1x_c = p1x; p1y_c = p1y;
7676
if ( clipLineSegment( clipExtent.xMinimum(), clipExtent.xMaximum(), clipExtent.yMinimum(), clipExtent.yMaximum(),
@@ -94,7 +94,7 @@ const unsigned char* QgsClipper::clippedLineWKB( const unsigned char* wkb, const
9494
}
9595
}
9696
}
97-
return wkb;
97+
return wkbPtr;
9898
}
9999

100100
void QgsClipper::connectSeparatedLines( double x0, double y0, double x1, double y1,

src/core/symbology-ng/qgsrendererv2.cpp

Lines changed: 40 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@
3636

3737
const 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

6161
const 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

116111
const 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

187179
void 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

Comments
 (0)