@@ -63,7 +63,6 @@ void QgsInvertedPolygonRenderer::startRender( QgsRenderContext& context, const Q
63
63
return ;
64
64
}
65
65
66
- mSubRenderer ->startRender ( context, fields );
67
66
mFeaturesCategoryMap .clear ();
68
67
mFeatureDecorations .clear ();
69
68
mFields = fields;
@@ -81,28 +80,36 @@ void QgsInvertedPolygonRenderer::startRender( QgsRenderContext& context, const Q
81
80
// convert viewport to dest CRS
82
81
QRect e ( context.painter ()->viewport () );
83
82
// add some space to hide borders and tend to infinity
84
- e.adjust ( -e.width ()*10 , -e.height ()*10 , e.width ()*10 , e.height ()*10 );
83
+ e.adjust ( -e.width ()*5 , -e.height ()*5 , e.width ()*5 , e.height ()*5 );
85
84
QgsPolyline exteriorRing;
86
85
exteriorRing << mtp.toMapCoordinates ( e.topLeft () );
87
86
exteriorRing << mtp.toMapCoordinates ( e.topRight () );
88
87
exteriorRing << mtp.toMapCoordinates ( e.bottomRight () );
89
88
exteriorRing << mtp.toMapCoordinates ( e.bottomLeft () );
90
89
exteriorRing << mtp.toMapCoordinates ( e.topLeft () );
91
90
92
- mTransform = context.coordinateTransform ();
91
+ // copy the rendering context
92
+ mContext = context;
93
+
93
94
// If reprojection is enabled, we must reproject during renderFeature
94
95
// and act as if there is no reprojection
95
96
// If we don't do that, there is no need to have a simple rectangular extent
96
97
// that covers the whole screen
97
98
// (a rectangle in the destCRS cannot be expressed as valid coordinates in the sourceCRS in general)
98
- if (mTransform )
99
+ if ( context. coordinateTransform () )
99
100
{
100
101
// disable projection
101
- context.setCoordinateTransform (0 );
102
+ mContext .setCoordinateTransform (0 );
103
+ // recompute extent so that polygon clipping is correct
104
+ QRect v ( context.painter ()->viewport () );
105
+ mContext .setExtent ( QgsRectangle ( mtp.toMapCoordinates ( v.topLeft () ), mtp.toMapCoordinates ( v.bottomRight () ) ) );
106
+ // do we have to recompute the MapToPixel ?
102
107
}
103
108
104
109
mExtentPolygon .clear ();
105
110
mExtentPolygon .append (exteriorRing);
111
+
112
+ mSubRenderer ->startRender ( mContext , fields );
106
113
}
107
114
108
115
bool QgsInvertedPolygonRenderer::renderFeature ( QgsFeature& feature, QgsRenderContext& context, int layer, bool selected, bool drawVertexMarker )
@@ -173,6 +180,13 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
173
180
{
174
181
return false ;
175
182
}
183
+
184
+ const QgsCoordinateTransform* xform = context.coordinateTransform ();
185
+ if ( xform )
186
+ {
187
+ geom->transform ( *xform );
188
+ }
189
+
176
190
if ( (geom->wkbType () == QGis::WKBPolygon) ||
177
191
(geom->wkbType () == QGis::WKBPolygon25D) ) {
178
192
multi.append (geom->asPolygon () );
@@ -215,34 +229,12 @@ bool QgsInvertedPolygonRenderer::renderFeature( QgsFeature& feature, QgsRenderCo
215
229
216
230
for ( int i = 0 ; i < multi.size (); i++ ) {
217
231
// add the exterior ring as interior ring to the first polygon
218
- if ( mTransform ) {
219
- QgsPolyline new_ls;
220
- QgsPolyline& old_ls = multi[i][0 ];
221
- for ( int k = 0 ; k < old_ls.size (); k++ ) {
222
- new_ls.append ( mTransform ->transform ( old_ls[k] ) );
223
- }
224
- cFeat.multiPolygon [0 ].append ( new_ls );
225
- }
226
- else
227
- {
228
- cFeat.multiPolygon [0 ].append ( multi[i][0 ] );
229
- }
232
+ cFeat.multiPolygon [0 ].append ( multi[i][0 ] );
233
+
230
234
// add interior rings as new polygons
231
235
for ( int j = 1 ; j < multi[i].size (); j++ ) {
232
236
QgsPolygon new_poly;
233
- if ( mTransform ) {
234
- QgsPolyline new_ls;
235
- QgsPolyline& old_ls = multi[i][j];
236
- for ( int k = 0 ; k < old_ls.size (); k++ ) {
237
- new_ls.append ( mTransform ->transform ( old_ls[k] ) );
238
- }
239
- new_poly.append ( new_ls );
240
- }
241
- else
242
- {
243
- new_poly.append ( multi[i][j] );
244
- }
245
-
237
+ new_poly.append ( multi[i][j] );
246
238
cFeat.multiPolygon .append ( new_poly );
247
239
}
248
240
}
@@ -281,7 +273,7 @@ void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context )
281
273
}
282
274
}
283
275
}
284
- mSubRenderer ->renderFeature ( feat, context );
276
+ mSubRenderer ->renderFeature ( feat, mContext );
285
277
}
286
278
287
279
// when no features are visible, we still have to draw the exterior rectangle
@@ -293,22 +285,16 @@ void QgsInvertedPolygonRenderer::stopRender( QgsRenderContext& context )
293
285
// empty feature with default attributes
294
286
QgsFeature feat ( mFields );
295
287
feat.setGeometry ( QgsGeometry::fromPolygon ( mExtentPolygon ) );
296
- mSubRenderer ->renderFeature ( feat, context );
288
+ mSubRenderer ->renderFeature ( feat, mContext );
297
289
}
298
290
299
291
// draw feature decorations
300
292
foreach (FeatureDecoration deco, mFeatureDecorations )
301
293
{
302
- mSubRenderer ->renderFeature ( deco.feature , context , deco.layer , deco.selected , deco.drawMarkers );
294
+ mSubRenderer ->renderFeature ( deco.feature , mContext , deco.layer , deco.selected , deco.drawMarkers );
303
295
}
304
296
305
- mSubRenderer ->stopRender ( context );
306
-
307
- if ( mTransform )
308
- {
309
- // restore the coordinate transform if needed
310
- context.setCoordinateTransform ( mTransform );
311
- }
297
+ mSubRenderer ->stopRender ( mContext );
312
298
}
313
299
314
300
QString QgsInvertedPolygonRenderer::dump () const
0 commit comments