Skip to content

Commit 7e7770b

Browse files
committed
Fix incorrect render context scaling for scale bar rendering
1 parent 8f5e0cb commit 7e7770b

6 files changed

Lines changed: 55 additions & 30 deletions

src/core/composer/qgscomposerscalebar.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,10 @@ void QgsComposerScaleBar::paint( QPainter *painter, const QStyleOptionGraphicsIt
6969

7070
QgsRenderContext c = QgsComposerUtils::createRenderContextForMap( mComposerMap, painter );
7171

72+
// scale painter from mm to dots
73+
painter->scale( 1.0 / c.scaleFactor(), 1.0 / c.scaleFactor() );
7274
mStyle->draw( c, mSettings, createScaleContext() );
75+
painter->scale( c.scaleFactor(), c.scaleFactor() );
7376

7477
//draw frame and selection boxes if necessary
7578
drawFrame( painter );

src/core/scalebar/qgsdoubleboxscalebarrenderer.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,20 @@ void QgsDoubleBoxScaleBarRenderer::draw( QgsRenderContext &context, const QgsSca
2828
}
2929
QPainter *painter = context.painter();
3030

31-
double barTopPosition = QgsComposerUtils::fontAscentMM( settings.font() ) + settings.labelBarSpace() + settings.boxContentSpace();
32-
double segmentHeight = settings.height() / 2;
31+
double barTopPosition = context.convertToPainterUnits( QgsComposerUtils::fontAscentMM( settings.font() ) + settings.labelBarSpace() + settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters );
32+
double segmentHeight = context.convertToPainterUnits( settings.height() / 2, QgsUnitTypes::RenderMillimeters );
3333

3434
painter->save();
3535
if ( context.flags() & QgsRenderContext::Antialiasing )
3636
painter->setRenderHint( QPainter::Antialiasing, true );
37-
painter->setPen( settings.pen() );
37+
38+
QPen pen = settings.pen();
39+
pen.setWidthF( context.convertToPainterUnits( pen.widthF(), QgsUnitTypes::RenderMillimeters ) );
40+
painter->setPen( pen );
3841

3942
bool useColor = true; //alternate brush color/white
4043

41-
double xOffset = firstLabelXOffset( settings );
44+
double xOffset = context.convertToPainterUnits( firstLabelXOffset( settings ), QgsUnitTypes::RenderMillimeters );
4245

4346
QList<double> positions = segmentPositions( scaleContext, settings );
4447
QList<double> widths = segmentWidths( scaleContext, settings );
@@ -55,7 +58,9 @@ void QgsDoubleBoxScaleBarRenderer::draw( QgsRenderContext &context, const QgsSca
5558
painter->setBrush( settings.brush2() );
5659
}
5760

58-
QRectF segmentRectTop( positions.at( i ) + xOffset, barTopPosition, widths.at( i ), segmentHeight );
61+
QRectF segmentRectTop( context.convertToPainterUnits( positions.at( i ), QgsUnitTypes::RenderMillimeters ) + xOffset,
62+
barTopPosition,
63+
context.convertToPainterUnits( widths.at( i ), QgsUnitTypes::RenderMillimeters ), segmentHeight );
5964
painter->drawRect( segmentRectTop );
6065

6166
//draw bottom half
@@ -69,7 +74,9 @@ void QgsDoubleBoxScaleBarRenderer::draw( QgsRenderContext &context, const QgsSca
6974
painter->setBrush( settings.brush() );
7075
}
7176

72-
QRectF segmentRectBottom( positions.at( i ) + xOffset, barTopPosition + segmentHeight, widths.at( i ), segmentHeight );
77+
QRectF segmentRectBottom( context.convertToPainterUnits( positions.at( i ), QgsUnitTypes::RenderMillimeters ) + xOffset,
78+
barTopPosition + segmentHeight,
79+
context.convertToPainterUnits( widths.at( i ), QgsUnitTypes::RenderMillimeters ), segmentHeight );
7380
painter->drawRect( segmentRectBottom );
7481
useColor = !useColor;
7582
}

src/core/scalebar/qgsnumericscalebarrenderer.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@ void QgsNumericScaleBarRenderer::draw( QgsRenderContext &context, const QgsScale
3232
painter->save();
3333
if ( context.flags() & QgsRenderContext::Antialiasing )
3434
painter->setRenderHint( QPainter::Antialiasing, true );
35-
painter->setFont( settings.font() );
3635

37-
double margin = settings.boxContentSpace();
36+
QFont scaledFont = settings.font();
37+
scaledFont.setPointSizeF( scaledFont.pointSizeF() * context.scaleFactor() );
38+
39+
double margin = context.convertToPainterUnits( settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters );
3840
//map scalebar alignment to Qt::AlignmentFlag type
3941
Qt::AlignmentFlag hAlign = Qt::AlignLeft;
4042
switch ( settings.alignment() )
@@ -51,8 +53,9 @@ void QgsNumericScaleBarRenderer::draw( QgsRenderContext &context, const QgsScale
5153
}
5254

5355
//text destination is item's rect, excluding the margin
54-
QRectF painterRect( margin, margin, scaleContext.size.width() - 2 * margin, scaleContext.size.height() - 2 * margin );
55-
QgsComposerUtils::drawText( painter, painterRect, scaleText( scaleContext.scale ), settings.font(), settings.fontColor(), hAlign, Qt::AlignTop );
56+
QRectF painterRect( margin, margin, context.convertToPainterUnits( scaleContext.size.width(), QgsUnitTypes::RenderMillimeters ) - 2 * margin,
57+
context.convertToPainterUnits( scaleContext.size.height(), QgsUnitTypes::RenderMillimeters ) - 2 * margin );
58+
QgsComposerUtils::drawText( painter, painterRect, scaleText( scaleContext.scale ), scaledFont, settings.fontColor(), hAlign, Qt::AlignTop );
5659

5760
painter->restore();
5861
}

src/core/scalebar/qgsscalebarrenderer.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,12 @@ void QgsScaleBarRenderer::drawDefaultLabels( QgsRenderContext &context, const Qg
3131

3232
painter->save();
3333

34-
painter->setFont( settings.font() );
34+
QFont scaledFont = settings.font();
35+
scaledFont.setPointSizeF( scaledFont.pointSizeF() * context.scaleFactor() );
3536
painter->setPen( QPen( settings.fontColor() ) );
3637

3738
QString firstLabel = firstLabelString( settings );
38-
double xOffset = QgsComposerUtils::textWidthMM( settings.font(), firstLabel ) / 2;
39+
double xOffset = context.convertToPainterUnits( QgsComposerUtils::textWidthMM( settings.font(), firstLabel ) / 2, QgsUnitTypes::RenderMillimeters );
3940

4041
double currentLabelNumber = 0.0;
4142

@@ -64,8 +65,9 @@ void QgsScaleBarRenderer::drawDefaultLabels( QgsRenderContext &context, const Qg
6465

6566
if ( segmentCounter == 0 || segmentCounter >= nSegmentsLeft ) //don't draw label for intermediate left segments
6667
{
67-
QgsComposerUtils::drawText( painter, QPointF( positions.at( i ) - QgsComposerUtils::textWidthMM( settings.font(), currentNumericLabel ) / 2 + xOffset, QgsComposerUtils::fontAscentMM( settings.font() ) + settings.boxContentSpace() ),
68-
currentNumericLabel, settings.font(), settings.fontColor() );
68+
QgsComposerUtils::drawText( painter, QPointF( context.convertToPainterUnits( positions.at( i ) - QgsComposerUtils::textWidthMM( settings.font(), currentNumericLabel ) / 2, QgsUnitTypes::RenderMillimeters ) + xOffset,
69+
context.convertToPainterUnits( QgsComposerUtils::fontAscentMM( settings.font() ) + settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters ) ),
70+
currentNumericLabel, scaledFont, settings.fontColor() );
6971
}
7072

7173
if ( segmentCounter >= nSegmentsLeft )
@@ -79,8 +81,9 @@ void QgsScaleBarRenderer::drawDefaultLabels( QgsRenderContext &context, const Qg
7981
if ( !positions.isEmpty() )
8082
{
8183
currentNumericLabel = QString::number( currentLabelNumber / settings.mapUnitsPerScaleBarUnit() );
82-
QgsComposerUtils::drawText( painter, QPointF( positions.at( positions.size() - 1 ) + scaleContext.segmentWidth - QgsComposerUtils::textWidthMM( settings.font(), currentNumericLabel ) / 2 + xOffset, QgsComposerUtils::fontAscentMM( settings.font() ) + settings.boxContentSpace() ),
83-
currentNumericLabel + ' ' + settings.unitLabel(), settings.font(), settings.fontColor() );
84+
QgsComposerUtils::drawText( painter, QPointF( context.convertToPainterUnits( positions.at( positions.size() - 1 ) + scaleContext.segmentWidth - QgsComposerUtils::textWidthMM( settings.font(), currentNumericLabel ) / 2, QgsUnitTypes::RenderMillimeters ) + xOffset,
85+
context.convertToPainterUnits( QgsComposerUtils::fontAscentMM( settings.font() ) + settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters ) ),
86+
currentNumericLabel + ' ' + settings.unitLabel(), scaledFont, settings.fontColor() );
8487
}
8588

8689
painter->restore();

src/core/scalebar/qgssingleboxscalebarrenderer.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,18 @@ void QgsSingleBoxScaleBarRenderer::draw( QgsRenderContext &context, const QgsSca
2828
}
2929
QPainter *painter = context.painter();
3030

31-
double barTopPosition = QgsComposerUtils::fontAscentMM( settings.font() ) + settings.labelBarSpace() + settings.boxContentSpace();
31+
double barTopPosition = context.convertToPainterUnits( QgsComposerUtils::fontAscentMM( settings.font() ) + settings.labelBarSpace() + settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters );
3232

3333
painter->save();
3434
if ( context.flags() & QgsRenderContext::Antialiasing )
3535
painter->setRenderHint( QPainter::Antialiasing, true );
36-
painter->setPen( settings.pen() );
36+
37+
QPen pen = settings.pen();
38+
pen.setWidthF( context.convertToPainterUnits( pen.widthF(), QgsUnitTypes::RenderMillimeters ) );
39+
painter->setPen( pen );
3740

3841
bool useColor = true; //alternate brush color/white
39-
double xOffset = firstLabelXOffset( settings );
42+
double xOffset = context.convertToPainterUnits( firstLabelXOffset( settings ), QgsUnitTypes::RenderMillimeters );
4043

4144
QList<double> positions = segmentPositions( scaleContext, settings );
4245
QList<double> widths = segmentWidths( scaleContext, settings );
@@ -52,7 +55,9 @@ void QgsSingleBoxScaleBarRenderer::draw( QgsRenderContext &context, const QgsSca
5255
painter->setBrush( settings.brush2() );
5356
}
5457

55-
QRectF segmentRect( positions.at( i ) + xOffset, barTopPosition, widths.at( i ), settings.height() );
58+
QRectF segmentRect( context.convertToPainterUnits( positions.at( i ), QgsUnitTypes::RenderMillimeters ) + xOffset,
59+
barTopPosition, context.convertToPainterUnits( widths.at( i ), QgsUnitTypes::RenderMillimeters ),
60+
context.convertToPainterUnits( settings.height(), QgsUnitTypes::RenderMillimeters ) );
5661
painter->drawRect( segmentRect );
5762
useColor = !useColor;
5863
}

src/core/scalebar/qgsticksscalebarrenderer.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,30 +40,33 @@ void QgsTicksScaleBarRenderer::draw( QgsRenderContext &context, const QgsScaleBa
4040

4141
QPainter *painter = context.painter();
4242

43-
double barTopPosition = QgsComposerUtils::fontAscentMM( settings.font() ) + settings.labelBarSpace() + settings.boxContentSpace();
44-
double middlePosition = barTopPosition + settings.height() / 2.0;
45-
double bottomPosition = barTopPosition + settings.height();
43+
double barTopPosition = context.convertToPainterUnits( QgsComposerUtils::fontAscentMM( settings.font() ) + settings.labelBarSpace() + settings.boxContentSpace(), QgsUnitTypes::RenderMillimeters );
44+
double middlePosition = barTopPosition + context.convertToPainterUnits( settings.height() / 2.0, QgsUnitTypes::RenderMillimeters );
45+
double bottomPosition = barTopPosition + context.convertToPainterUnits( settings.height(), QgsUnitTypes::RenderMillimeters );
4646

47-
double xOffset = firstLabelXOffset( settings );
47+
double xOffset = context.convertToPainterUnits( firstLabelXOffset( settings ), QgsUnitTypes::RenderMillimeters );
4848

4949
painter->save();
5050
if ( context.flags() & QgsRenderContext::Antialiasing )
5151
painter->setRenderHint( QPainter::Antialiasing, true );
5252

53-
painter->setPen( settings.pen() );
53+
QPen pen = settings.pen();
54+
pen.setWidthF( context.convertToPainterUnits( pen.widthF(), QgsUnitTypes::RenderMillimeters ) );
55+
painter->setPen( pen );
5456

5557
QList<double> positions = segmentPositions( scaleContext, settings );
5658

5759
for ( int i = 0; i < positions.size(); ++i )
5860
{
59-
painter->drawLine( QLineF( positions.at( i ) + xOffset, barTopPosition,
60-
positions.at( i ) + xOffset, barTopPosition + settings.height() ) );
61+
painter->drawLine( QLineF( context.convertToPainterUnits( positions.at( i ), QgsUnitTypes::RenderMillimeters ) + xOffset, barTopPosition,
62+
context.convertToPainterUnits( positions.at( i ), QgsUnitTypes::RenderMillimeters ) + xOffset,
63+
barTopPosition + context.convertToPainterUnits( settings.height(), QgsUnitTypes::RenderMillimeters ) ) );
6164
}
6265

6366
//draw last tick and horizontal line
6467
if ( !positions.isEmpty() )
6568
{
66-
double lastTickPositionX = positions.at( positions.size() - 1 ) + scaleContext.segmentWidth + xOffset;
69+
double lastTickPositionX = context.convertToPainterUnits( positions.at( positions.size() - 1 ) + scaleContext.segmentWidth, QgsUnitTypes::RenderMillimeters ) + xOffset;
6770
double verticalPos = 0.0;
6871
switch ( mTickPosition )
6972
{
@@ -78,9 +81,10 @@ void QgsTicksScaleBarRenderer::draw( QgsRenderContext &context, const QgsScaleBa
7881
break;
7982
}
8083
//horizontal line
81-
painter->drawLine( QLineF( xOffset + positions.at( 0 ), verticalPos, lastTickPositionX, verticalPos ) );
84+
painter->drawLine( QLineF( xOffset + context.convertToPainterUnits( positions.at( 0 ), QgsUnitTypes::RenderMillimeters ),
85+
verticalPos, lastTickPositionX, verticalPos ) );
8286
//last vertical line
83-
painter->drawLine( QLineF( lastTickPositionX, barTopPosition, lastTickPositionX, barTopPosition + settings.height() ) );
87+
painter->drawLine( QLineF( lastTickPositionX, barTopPosition, lastTickPositionX, barTopPosition + context.convertToPainterUnits( settings.height(), QgsUnitTypes::RenderMillimeters ) ) );
8488
}
8589

8690
painter->restore();

0 commit comments

Comments
 (0)