Skip to content

Commit 8d5a24c

Browse files
author
mhugent
committed
First try to fix font scale problem for map labels
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@9557 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 8ec5935 commit 8d5a24c

File tree

6 files changed

+20
-35
lines changed

6 files changed

+20
-35
lines changed

python/core/qgslabel.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public:
4747
void renderLabel ( QPainter* painter, QgsRect& viewExtent,
4848
QgsCoordinateTransform* coordinateTransform,
4949
QgsMapToPixel *transform,
50-
QgsFeature &feature, bool selected, QgsLabelAttributes *classAttributes=0, double sizeScale = 1);
50+
QgsFeature &feature, bool selected, QgsLabelAttributes *classAttributes=0, double sizeScale = 1, double rasterScaleFactor = 1);
5151

5252
/** Reads the renderer configuration from an XML file
5353
@param rnode the Dom node to read

python/core/qgsvectorlayer.sip

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -298,11 +298,6 @@ public:
298298
/** Draws the layer labels using coordinate transformation */
299299
void drawLabels(QgsRenderContext& rendererContext);
300300

301-
/** \brief Draws the layer labels using coordinate transformation
302-
* \param scale size scale, applied to all values in pixels
303-
*/
304-
void drawLabels(QPainter * p, const QgsRect& viewExtent, const QgsMapToPixel* cXf, const QgsCoordinateTransform* ct, double scale);
305-
306301
/** returns list of attributes */
307302
QList<int> pendingAllAttributesList();
308303

src/core/qgslabel.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ void QgsLabel::renderLabel( QPainter * painter, const QgsRect& viewExtent,
8686
const QgsCoordinateTransform* coordinateTransform,
8787
const QgsMapToPixel *transform,
8888
QgsFeature &feature, bool selected, QgsLabelAttributes *classAttributes,
89-
double sizeScale )
89+
double sizeScale, double rasterScaleFactor )
9090
{
9191

9292
QPen pen;
@@ -155,6 +155,11 @@ void QgsLabel::renderLabel( QPainter * painter, const QgsRect& viewExtent,
155155
double sizeMM = size * 0.3527;
156156
size = sizeMM * sizeScale;
157157
}
158+
159+
//Request font larger (multiplied by rasterScaleFactor) as a workaround for the Qt font bug
160+
//and scale the painter down by rasterScaleFactor when drawing the label
161+
size *= rasterScaleFactor;
162+
158163
if ( size > 0.0 )
159164
{
160165
font.setPixelSize( size );
@@ -349,7 +354,7 @@ void QgsLabel::renderLabel( QPainter * painter, const QgsRect& viewExtent,
349354
{
350355
renderLabel( painter, overridePoint, coordinateTransform,
351356
transform, text, font, pen, dx, dy,
352-
xoffset, yoffset, ang, width, height, alignment, sizeScale );
357+
xoffset, yoffset, ang, width, height, alignment, sizeScale, rasterScaleFactor );
353358
}
354359
else
355360
{
@@ -359,7 +364,7 @@ void QgsLabel::renderLabel( QPainter * painter, const QgsRect& viewExtent,
359364
{
360365
renderLabel( painter, points[i], coordinateTransform,
361366
transform, text, font, pen, dx, dy,
362-
xoffset, yoffset, ang, width, height, alignment, sizeScale );
367+
xoffset, yoffset, ang, width, height, alignment, sizeScale, rasterScaleFactor );
363368
}
364369
}
365370
}
@@ -371,7 +376,7 @@ void QgsLabel::renderLabel( QPainter* painter, QgsPoint point,
371376
int dx, int dy,
372377
double xoffset, double yoffset,
373378
double ang,
374-
int width, int height, int alignment, double sizeScale )
379+
int width, int height, int alignment, double sizeScale, double rasterScaleFactor )
375380
{
376381
// Convert point to projected units
377382
if ( coordinateTransform )
@@ -397,18 +402,21 @@ void QgsLabel::renderLabel( QPainter* painter, QgsPoint point,
397402

398403
x = x + xoffset * cos( rad ) - yoffset * sin( rad );
399404
y = y - xoffset * sin( rad ) - yoffset * cos( rad );
405+
400406

401407
painter->save();
402408
painter->setFont( font );
403409
painter->translate( x, y );
410+
//correct oversampled font size back by scaling painter down
411+
painter->scale(1.0 / rasterScaleFactor, 1.0 / rasterScaleFactor);
404412
painter->rotate( -ang );
405413

406414
//
407415
// Draw a buffer behind the text if one is desired
408416
//
409417
if ( mLabelAttributes->bufferSizeIsSet() && mLabelAttributes->bufferEnabled() )
410418
{
411-
double myBufferSize = mLabelAttributes->bufferSize() * 0.3527 * sizeScale;
419+
double myBufferSize = mLabelAttributes->bufferSize() * 0.3527 * sizeScale * rasterScaleFactor;
412420
QPen bufferPen;
413421
if ( mLabelAttributes->bufferColorIsSet() )
414422
{
@@ -427,7 +435,7 @@ void QgsLabel::renderLabel( QPainter* painter, QgsPoint point,
427435
}
428436
else //draw more dense in case of logical devices
429437
{
430-
bufferStepSize = 0.1;
438+
bufferStepSize = 1 / rasterScaleFactor;
431439
}
432440

433441
for ( double i = dx - myBufferSize; i <= dx + myBufferSize; i += bufferStepSize )

src/core/qgslabel.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class CORE_EXPORT QgsLabel
8888
void renderLabel( QPainter* painter, const QgsRect& viewExtent,
8989
const QgsCoordinateTransform* coordinateTransform,
9090
const QgsMapToPixel *transform,
91-
QgsFeature &feature, bool selected, QgsLabelAttributes *classAttributes = 0, double sizeScale = 1. );
91+
QgsFeature &feature, bool selected, QgsLabelAttributes *classAttributes = 0, double sizeScale = 1., double rasterScaleFactor = 1.0);
9292

9393
/** Reads the renderer configuration from an XML file
9494
@param rnode the Dom node to read
@@ -134,7 +134,7 @@ class CORE_EXPORT QgsLabel
134134
int dx, int dy,
135135
double xoffset, double yoffset,
136136
double ang,
137-
int width, int height, int alignment, double sizeScale = 1.0 );
137+
int width, int height, int alignment, double sizeScale = 1.0, double rasterScaleFactor = 1.0);
138138

139139
/** Get label point for simple feature in map units */
140140
void labelPoint( std::vector<QgsPoint>&, QgsFeature &feature );

src/core/qgsvectorlayer.cpp

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -279,20 +279,10 @@ void QgsVectorLayer::setDisplayField( QString fldName )
279279
}
280280
}
281281

282-
void QgsVectorLayer::drawLabels( QgsRenderContext& rendererContext )
283-
{
284-
QPainter* thePainter = rendererContext.painter();
285-
if ( !thePainter )
286-
{
287-
return;
288-
}
289-
drawLabels( thePainter, rendererContext.extent(), &( rendererContext.mapToPixel() ), rendererContext.coordinateTransform(), rendererContext.scaleFactor() );
290-
}
291-
292282
// NOTE this is a temporary method added by Tim to prevent label clipping
293283
// which was occurring when labeller was called in the main draw loop
294284
// This method will probably be removed again in the near future!
295-
void QgsVectorLayer::drawLabels( QPainter * p, const QgsRect& viewExtent, const QgsMapToPixel* theMapToPixelTransform, const QgsCoordinateTransform* ct, double scale )
285+
void QgsVectorLayer::drawLabels( QgsRenderContext& rendererContext )
296286
{
297287
QgsDebugMsg( "Starting draw of labels" );
298288

@@ -311,15 +301,15 @@ void QgsVectorLayer::drawLabels( QPainter * p, const QgsRect& viewExtent, const
311301
{
312302
// select the records in the extent. The provider sets a spatial filter
313303
// and sets up the selection set for retrieval
314-
select( attributes, viewExtent );
304+
select( attributes, rendererContext.extent() );
315305

316306
QgsFeature fet;
317307
while ( nextFeature( fet ) )
318308
{
319309
if ( mRenderer->willRenderFeature( &fet ) )
320310
{
321311
bool sel = mSelectedFeatureIds.contains( fet.id() );
322-
mLabel->renderLabel( p, viewExtent, ct, theMapToPixelTransform, fet, sel, 0, scale );
312+
mLabel->renderLabel( rendererContext.painter(), rendererContext.extent(), rendererContext.coordinateTransform(), &(rendererContext.mapToPixel()), fet, sel, 0, rendererContext.scaleFactor(), rendererContext.rasterScaleFactor());
323313
}
324314
featureCount++;
325315
}

src/core/qgsvectorlayer.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -357,14 +357,6 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
357357
/** Draws the layer labels using coordinate transformation */
358358
void drawLabels( QgsRenderContext& rendererContext );
359359

360-
/** \brief Draws the layer labels using coordinate transformation
361-
* \param scale size scale, applied to all values in pixels
362-
*/
363-
void drawLabels( QPainter * p, const QgsRect& viewExtent,
364-
const QgsMapToPixel* cXf,
365-
const QgsCoordinateTransform* ct,
366-
double scale );
367-
368360
/** returns field list in the to-be-committed state */
369361
const QgsFieldMap &pendingFields();
370362

0 commit comments

Comments
 (0)