@@ -150,12 +150,15 @@ void QgsLabel::renderLabel( QPainter * painter, const QgsRect& viewExtent,
150
150
{
151
151
size *= scale;
152
152
}
153
- else
153
+ else // point units
154
154
{
155
- size *= sizeScale;
155
+ double sizeMM = size * 0.3527 ;
156
+ size = sizeMM * sizeScale;
156
157
}
157
158
if ( size > 0.0 )
158
- font.setPointSizeF ( size );
159
+ {
160
+ font.setPixelSize (size);
161
+ }
159
162
160
163
value = fieldValue ( Color, feature );
161
164
if ( value.isEmpty () )
@@ -237,6 +240,7 @@ void QgsLabel::renderLabel( QPainter * painter, const QgsRect& viewExtent,
237
240
width = fm.width ( text );
238
241
height = fm.height ();
239
242
}
243
+
240
244
int dx = 0 ;
241
245
int dy = 0 ;
242
246
@@ -313,12 +317,17 @@ void QgsLabel::renderLabel( QPainter * painter, const QgsRect& viewExtent,
313
317
yoffset = value.toDouble ();
314
318
}
315
319
316
- // recalc offset to points
320
+ // recalc offset to pixels
317
321
if ( mLabelAttributes ->offsetType () == QgsLabelAttributes::MapUnits )
318
322
{
319
323
xoffset *= scale;
320
324
yoffset *= scale;
321
325
}
326
+ else
327
+ {
328
+ xoffset = xoffset * 0.3527 * sizeScale;
329
+ yoffset = yoffset * 0.3527 * sizeScale;
330
+ }
322
331
323
332
// Angle
324
333
double ang;
@@ -340,7 +349,7 @@ void QgsLabel::renderLabel( QPainter * painter, const QgsRect& viewExtent,
340
349
{
341
350
renderLabel ( painter, overridePoint, coordinateTransform,
342
351
transform, text, font, pen, dx, dy,
343
- xoffset, yoffset, ang, width, height, alignment );
352
+ xoffset, yoffset, ang, width, height, alignment, sizeScale );
344
353
}
345
354
else
346
355
{
@@ -350,7 +359,7 @@ void QgsLabel::renderLabel( QPainter * painter, const QgsRect& viewExtent,
350
359
{
351
360
renderLabel ( painter, points[i], coordinateTransform,
352
361
transform, text, font, pen, dx, dy,
353
- xoffset, yoffset, ang, width, height, alignment );
362
+ xoffset, yoffset, ang, width, height, alignment, sizeScale );
354
363
}
355
364
}
356
365
}
@@ -362,7 +371,7 @@ void QgsLabel::renderLabel( QPainter* painter, QgsPoint point,
362
371
int dx, int dy,
363
372
double xoffset, double yoffset,
364
373
double ang,
365
- int width, int height, int alignment )
374
+ int width, int height, int alignment, double sizeScale )
366
375
{
367
376
// Convert point to projected units
368
377
if ( coordinateTransform )
@@ -399,23 +408,36 @@ void QgsLabel::renderLabel( QPainter* painter, QgsPoint point,
399
408
//
400
409
if ( mLabelAttributes ->bufferSizeIsSet () && mLabelAttributes ->bufferEnabled () )
401
410
{
402
- int myBufferSize = static_cast <int >( mLabelAttributes ->bufferSize () );
411
+ int myBufferSize = static_cast <int >( mLabelAttributes ->bufferSize () * 0.3527 * sizeScale);
412
+ QPen bufferPen;
403
413
if ( mLabelAttributes ->bufferColorIsSet () )
404
414
{
405
- painter-> setPen ( mLabelAttributes ->bufferColor () );
415
+ bufferPen. setColor ( mLabelAttributes ->bufferColor ());
406
416
}
407
417
else // default to a white buffer
408
418
{
409
- painter-> setPen ( Qt::white );
419
+ bufferPen. setColor ( Qt::white );
410
420
}
411
- for ( int i = dx - myBufferSize; i <= dx + myBufferSize; i++ )
421
+ painter->setPen (bufferPen);
422
+
423
+ double bufferStepSize; // hack to distinguish pixel devices from logical devices
424
+ if ((sizeScale - 1 ) > 1.5 )
425
+ {
426
+ bufferStepSize = 1 ;
427
+ }
428
+ else // draw more dense in case of logical devices
429
+ {
430
+ bufferStepSize = 0.25 ;
431
+ }
432
+
433
+ for ( double i = dx - myBufferSize; i <= dx + myBufferSize; i+= 0.25 )
412
434
{
413
- for ( int j = dy - myBufferSize; j <= dy + myBufferSize; j++ )
435
+ for ( double j = dy - myBufferSize; j <= dy + myBufferSize; j+= 0.25 )
414
436
{
415
437
if ( mLabelAttributes ->multilineEnabled () )
416
- painter->drawText ( i , j - height, width, height, alignment, text );
438
+ painter->drawText ( QRectF ( i , j - height, width, height) , alignment, text );
417
439
else
418
- painter->drawText ( i , j, text );
440
+ painter->drawText ( QPointF ( i , j) , text );
419
441
}
420
442
}
421
443
}
0 commit comments