@@ -60,19 +60,19 @@ class MyLabel : public PalGeometry
60
60
const char * strId () { return mStrId .data (); }
61
61
QString text () { return mText ; }
62
62
63
- pal::LabelInfo* info ( QFontMetrics* fm, const QgsMapToPixel* xform )
63
+ pal::LabelInfo* info ( QFontMetrics* fm, const QgsMapToPixel* xform, double fontScale )
64
64
{
65
65
if ( mInfo ) return mInfo ;
66
66
67
67
// create label info!
68
68
QgsPoint ptZero = xform->toMapCoordinates ( 0 , 0 );
69
- QgsPoint ptSize = xform->toMapCoordinates ( 0 , -fm->height () );
69
+ QgsPoint ptSize = xform->toMapCoordinates ( 0 , ( int )( -fm->height () / fontScale ) );
70
70
71
71
mInfo = new pal::LabelInfo ( mText .count (), ptSize.y () - ptZero.y () );
72
72
for ( int i = 0 ; i < mText .count (); i++ )
73
73
{
74
74
mInfo ->char_info [i].chr = mText [i].unicode ();
75
- ptSize = xform->toMapCoordinates ( fm->width ( mText [i] ), 0 );
75
+ ptSize = xform->toMapCoordinates (( int )( fm->width ( mText [i] ) / fontScale ) , 0 );
76
76
mInfo ->char_info [i].width = ptSize.x () - ptZero.x ();
77
77
}
78
78
return mInfo ;
@@ -106,6 +106,8 @@ LayerSettings::LayerSettings()
106
106
labelPerPart = false ;
107
107
mergeLines = false ;
108
108
minFeatureSize = 0.0 ;
109
+ vectorScaleFactor = 1.0 ;
110
+ rasterCompressFactor = 1.0 ;
109
111
}
110
112
111
113
LayerSettings::LayerSettings ( const LayerSettings& s )
@@ -127,6 +129,8 @@ LayerSettings::LayerSettings( const LayerSettings& s )
127
129
labelPerPart = s.labelPerPart ;
128
130
mergeLines = s.mergeLines ;
129
131
minFeatureSize = s.minFeatureSize ;
132
+ vectorScaleFactor = s.vectorScaleFactor ;
133
+ rasterCompressFactor = s.rasterCompressFactor ;
130
134
131
135
fontMetrics = NULL ;
132
136
ct = NULL ;
@@ -251,11 +255,12 @@ bool LayerSettings::checkMinimumSizeMM( const QgsRenderContext& ct, QgsGeometry*
251
255
252
256
void LayerSettings::calculateLabelSize ( QString text, double & labelX, double & labelY )
253
257
{
254
- // QFontMetrics fontMetrics(textFont);
255
- QRect labelRect = /* QRect(0,0,20,20);*/ fontMetrics->boundingRect ( text );
258
+ QRectF labelRect = fontMetrics->boundingRect ( text );
259
+ double w = labelRect.width () / rasterCompressFactor;
260
+ double h = labelRect.height () / rasterCompressFactor;
261
+
262
+ QgsPoint ptSize = xform->toMapCoordinates ( w, h );
256
263
257
- // 2px border...
258
- QgsPoint ptSize = xform->toMapCoordinates ( labelRect.width () + 2 , labelRect.height () + 2 );
259
264
labelX = fabs ( ptSize.x () - ptZero.x () );
260
265
labelY = fabs ( ptSize.y () - ptZero.y () );
261
266
}
@@ -295,11 +300,11 @@ void LayerSettings::registerFeature( QgsFeature& f, const QgsRenderContext& cont
295
300
296
301
// TODO: only for placement which needs character info
297
302
pal::Feature* feat = palLayer->getFeature ( lbl->strId () );
298
- feat->setLabelInfo ( lbl->info ( fontMetrics, xform ) );
303
+ feat->setLabelInfo ( lbl->info ( fontMetrics, xform, rasterCompressFactor ) );
299
304
300
305
// TODO: allow layer-wide feature dist in PAL...?
301
306
if ( dist != 0 )
302
- feat->setDistLabel ( fabs ( ptOne.x () - ptZero.x () )* dist );
307
+ feat->setDistLabel ( fabs ( ptOne.x () - ptZero.x () )* dist * vectorScaleFactor );
303
308
}
304
309
305
310
@@ -402,14 +407,19 @@ int PalLabeling::prepareLayer( QgsVectorLayer* layer, int& attrIndex, QgsRenderC
402
407
l->setMergeConnectedLines ( lyr.mergeLines );
403
408
404
409
// set font size from points to output size
405
- double size = 0.3527 * lyr.textFont .pointSizeF () * ctx.scaleFactor (); // * ctx.rasterScaleFactor();
406
- lyr.textFont .setPixelSize (( int )size );
410
+ double size = 0.3527 * lyr.textFont .pointSizeF () * ctx.scaleFactor ();
411
+ // request larger font and then scale down painter (to avoid Qt font scale bug)
412
+ lyr.textFont .setPixelSize (( int )( size*ctx.rasterScaleFactor () + 0.5 ) );
413
+
414
+ // raster and vector scale factors
415
+ lyr.vectorScaleFactor = ctx.scaleFactor ();
416
+ lyr.rasterCompressFactor = ctx.rasterScaleFactor ();
407
417
408
418
// save the pal layer to our layer context (with some additional info)
409
419
lyr.palLayer = l;
410
420
lyr.fieldIndex = fldIndex;
411
421
lyr.fontMetrics = new QFontMetrics ( lyr.textFont );
412
- lyr. fontBaseline = lyr. fontMetrics -> boundingRect ( " X " ). bottom (); // dummy text to find out how many pixels of the text are below the baseline
422
+
413
423
lyr.xform = mMapRenderer ->coordinateTransform ();
414
424
if ( mMapRenderer ->hasCrsTransformEnabled () )
415
425
lyr.ct = new QgsCoordinateTransform ( layer->srs (), mMapRenderer ->destinationSrs () );
@@ -623,16 +633,20 @@ void PalLabeling::drawLabel( pal::LabelPosition* label, QPainter* painter, const
623
633
624
634
// QgsDebugMsg( "drawLabel " + QString::number( drawBuffer ) + " " + txt );
625
635
626
- // shift by one as we have 2px border
627
636
painter->save ();
628
637
painter->translate ( QPointF ( outPt.x (), outPt.y () ) );
629
638
painter->rotate ( -label->getAlpha () * 180 / M_PI );
630
- painter->translate ( QPointF ( 1 , -1 - lyr.fontBaseline ) );
639
+
640
+ // scale down painter: the font size has been multiplied by raster scale factor
641
+ // to workaround a Qt font scaling bug with small font sizes
642
+ painter->scale ( 1.0 / lyr.rasterCompressFactor , 1.0 / lyr.rasterCompressFactor );
643
+
644
+ painter->translate ( QPointF ( 0 , - lyr.fontMetrics ->descent () ) );
631
645
632
646
if ( drawBuffer )
633
647
{
634
648
// we're drawing buffer
635
- drawLabelBuffer ( painter, txt, lyr.textFont , lyr.bufferSize , lyr.bufferColor );
649
+ drawLabelBuffer ( painter, txt, lyr.textFont , lyr.bufferSize * lyr. vectorScaleFactor * lyr. rasterCompressFactor , lyr.bufferColor );
636
650
}
637
651
else
638
652
{
@@ -654,7 +668,7 @@ void PalLabeling::drawLabel( pal::LabelPosition* label, QPainter* painter, const
654
668
}
655
669
656
670
657
- void PalLabeling::drawLabelBuffer ( QPainter* p, QString text, const QFont& font, int size, QColor color )
671
+ void PalLabeling::drawLabelBuffer ( QPainter* p, QString text, const QFont& font, double size, QColor color )
658
672
{
659
673
/*
660
674
p->setFont( font );
@@ -666,7 +680,9 @@ void PalLabeling::drawLabelBuffer( QPainter* p, QString text, const QFont& font,
666
680
667
681
QPainterPath path;
668
682
path.addText ( 0 , 0 , font, text );
669
- p->setPen ( QPen ( color, size ) );
683
+ QPen pen ( color );
684
+ pen.setWidthF ( size );
685
+ p->setPen ( pen );
670
686
p->setBrush ( color );
671
687
p->drawPath ( path );
672
688
}
0 commit comments