@@ -1896,25 +1896,32 @@ void QgsPalLayerSettings::calculateLabelSize( const QFontMetricsF* fm, QString t
1896
1896
#endif
1897
1897
}
1898
1898
1899
-
1900
- void QgsPalLayerSettings::registerFeature ( QgsFeature& f, QgsRenderContext &context, const QString& dxfLayer, QgsLabelFeature** labelFeature )
1899
+ void QgsPalLayerSettings::registerFeature ( QgsFeature& f, QgsRenderContext &context, const QString& dxfLayer, QgsLabelFeature** labelFeature , QgsGeometry* obstacleGeometry )
1901
1900
{
1902
1901
// either used in QgsPalLabeling (palLayer is set) or in QgsLabelingEngineV2 (labelFeature is set)
1903
1902
Q_ASSERT ( labelFeature );
1904
1903
1905
1904
Q_UNUSED ( dxfLayer ); // now handled in QgsDxfLabelProvider
1906
1905
1906
+ QVariant exprVal; // value() is repeatedly nulled on data defined evaluation and replaced when successful
1907
+ mCurFeat = &f;
1908
+
1909
+ // data defined is obstacle? calculate this first, to avoid wasting time working with obstacles we don't require
1910
+ bool isObstacle = obstacle; // start with layer default
1911
+ if ( dataDefinedEvaluate ( QgsPalLayerSettings::IsObstacle, exprVal, &context.expressionContext (), obstacle ) )
1912
+ {
1913
+ isObstacle = exprVal.toBool ();
1914
+ }
1915
+
1907
1916
if ( !drawLabels )
1908
1917
{
1909
- if ( obstacle )
1918
+ if ( isObstacle )
1910
1919
{
1911
- registerObstacleFeature ( f, context, QString (), labelFeature );
1920
+ registerObstacleFeature ( f, context, QString (), labelFeature, obstacleGeometry );
1912
1921
}
1913
1922
return ;
1914
1923
}
1915
1924
1916
- QVariant exprVal; // value() is repeatedly nulled on data defined evaluation and replaced when successful
1917
- mCurFeat = &f;
1918
1925
// mCurFields = &layer->pendingFields();
1919
1926
1920
1927
// store data defined-derived values for later adding to label feature for use during rendering
@@ -2237,7 +2244,6 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, QgsRenderContext &cont
2237
2244
const GEOSGeometry* geos_geom = 0 ;
2238
2245
const QgsGeometry* preparedGeom = geom;
2239
2246
QScopedPointer<QgsGeometry> scopedPreparedGeom;
2240
-
2241
2247
if ( QgsPalLabeling::geometryRequiresPreparation ( geom, context, ct, doClip ? extentGeom : 0 ) )
2242
2248
{
2243
2249
scopedPreparedGeom.reset ( QgsPalLabeling::prepareGeometry ( geom, context, ct, doClip ? extentGeom : 0 ) );
@@ -2250,6 +2256,22 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, QgsRenderContext &cont
2250
2256
{
2251
2257
geos_geom = geom->asGeos ();
2252
2258
}
2259
+ const GEOSGeometry* geosObstacleGeom = 0 ;
2260
+ const QgsGeometry* preparedObstacleGeom = obstacleGeometry;
2261
+ QScopedPointer<QgsGeometry> scopedObstacleGeom;
2262
+ if ( isObstacle )
2263
+ {
2264
+ if ( obstacleGeometry && QgsPalLabeling::geometryRequiresPreparation ( obstacleGeometry, context, ct, doClip ? extentGeom : 0 ) )
2265
+ {
2266
+ scopedObstacleGeom.reset ( QgsPalLabeling::prepareGeometry ( obstacleGeometry, context, ct, doClip ? extentGeom : 0 ) );
2267
+ preparedObstacleGeom = scopedObstacleGeom.data ();
2268
+ geosObstacleGeom = scopedObstacleGeom.data ()->asGeos ();
2269
+ }
2270
+ else if ( obstacleGeometry )
2271
+ {
2272
+ geosObstacleGeom = obstacleGeometry->asGeos ();
2273
+ }
2274
+ }
2253
2275
2254
2276
if ( minFeatureSize > 0 && !checkMinimumSizeMM ( context, preparedGeom, minFeatureSize ) )
2255
2277
return ;
@@ -2291,6 +2313,12 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, QgsRenderContext &cont
2291
2313
{
2292
2314
geos_geom_clone = GEOSGeom_clone_r ( QgsGeometry::getGEOSHandler (), geos_geom );
2293
2315
}
2316
+ GEOSGeometry* geosObstacleGeomClone = 0 ;
2317
+ if ( geosObstacleGeom )
2318
+ {
2319
+ geosObstacleGeomClone = GEOSGeom_clone_r ( QgsGeometry::getGEOSHandler (), geosObstacleGeom );
2320
+ }
2321
+
2294
2322
2295
2323
// data defined position / alignment / rotation?
2296
2324
bool dataDefinedPosition = false ;
@@ -2610,6 +2638,10 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, QgsRenderContext &cont
2610
2638
( *labelFeature )->setAlwaysShow ( alwaysShow );
2611
2639
( *labelFeature )->setRepeatDistance ( repeatDist );
2612
2640
( *labelFeature )->setLabelText ( labelText );
2641
+ if ( geosObstacleGeomClone )
2642
+ {
2643
+ ( *labelFeature )->setObstacleGeometry ( geosObstacleGeomClone );
2644
+ }
2613
2645
2614
2646
// store the label's calculated font for later use during painting
2615
2647
QgsDebugMsgLevel ( QString ( " PAL font stored definedFont: %1, Style: %2" ).arg ( labelFont.toString (), labelFont.styleName () ), 4 );
@@ -2678,13 +2710,6 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, QgsRenderContext &cont
2678
2710
}
2679
2711
}
2680
2712
2681
- // data defined is obstacle?
2682
- bool isObstacle = obstacle; // start with layer default
2683
- if ( dataDefinedEvaluate ( QgsPalLayerSettings::IsObstacle, exprVal, &context.expressionContext (), obstacle ) )
2684
- {
2685
- isObstacle = exprVal.toBool ();
2686
- }
2687
-
2688
2713
( *labelFeature )->setIsObstacle ( isObstacle );
2689
2714
2690
2715
double featObstacleFactor = obstacleFactor;
@@ -2705,14 +2730,22 @@ void QgsPalLayerSettings::registerFeature( QgsFeature& f, QgsRenderContext &cont
2705
2730
lf->setDataDefinedValues ( dataDefinedValues );
2706
2731
}
2707
2732
2708
-
2709
- void QgsPalLayerSettings::registerObstacleFeature ( QgsFeature& f, QgsRenderContext &context, const QString& dxfLayer, QgsLabelFeature** obstacleFeature )
2733
+ void QgsPalLayerSettings::registerObstacleFeature ( QgsFeature& f, QgsRenderContext &context, const QString& dxfLayer, QgsLabelFeature** obstacleFeature, QgsGeometry* obstacleGeometry )
2710
2734
{
2711
2735
Q_UNUSED ( dxfLayer ); // now handled in QgsDxfLabelProvider
2712
2736
2713
2737
mCurFeat = &f;
2714
2738
2715
- const QgsGeometry* geom = f.constGeometry ();
2739
+ const QgsGeometry* geom = 0 ;
2740
+ if ( obstacleGeometry )
2741
+ {
2742
+ geom = obstacleGeometry;
2743
+ }
2744
+ else
2745
+ {
2746
+ geom = f.constGeometry ();
2747
+ }
2748
+
2716
2749
if ( !geom )
2717
2750
{
2718
2751
return ;
0 commit comments