Index: src/plugins/labeling/labelingguibase.ui =================================================================== --- src/plugins/labeling/labelingguibase.ui (Revision 13534) +++ src/plugins/labeling/labelingguibase.ui (Arbeitskopie) @@ -206,7 +206,7 @@ - pixels + mm @@ -312,7 +312,7 @@ - pixels + mm @@ -472,9 +472,9 @@ - - - 1 + + + mm @@ -753,7 +753,6 @@ btnChangeFont btnTextColor chkBuffer - spinBufferSize btnBufferColor sliderPriority chkScaleBasedVisibility Index: src/plugins/labeling/pallabeling.cpp =================================================================== --- src/plugins/labeling/pallabeling.cpp (Revision 13534) +++ src/plugins/labeling/pallabeling.cpp (Arbeitskopie) @@ -105,6 +105,8 @@ bufferColor = Qt::white; labelPerPart = false; mergeLines = false; + vectorScaleFactor = 1.0; + rasterCompressFactor = 1.0; } LayerSettings::LayerSettings( const LayerSettings& s ) @@ -125,7 +127,8 @@ bufferColor = s.bufferColor; labelPerPart = s.labelPerPart; mergeLines = s.mergeLines; - + vectorScaleFactor = s.vectorScaleFactor; + rasterCompressFactor = s.rasterCompressFactor; fontMetrics = NULL; ct = NULL; } @@ -212,8 +215,10 @@ //QFontMetrics fontMetrics(textFont); QRect labelRect = /*QRect(0,0,20,20);*/ fontMetrics->boundingRect( text ); - // 2px border... - QgsPoint ptSize = xform->toMapCoordinates( labelRect.width() + 2, labelRect.height() + 2 ); + // 1mm border... + double border = vectorScaleFactor; + double buffer = bufferSize * vectorScaleFactor; + QgsPoint ptSize = xform->toMapCoordinates( labelRect.width() + 2 * ( border + buffer ) , labelRect.height() + 2 * ( border + buffer ) ); labelX = fabs( ptSize.x() - ptZero.x() ); labelY = fabs( ptSize.y() - ptZero.y() ); } @@ -252,7 +257,7 @@ // TODO: allow layer-wide feature dist in PAL...? if ( dist != 0 ) - feat->setDistLabel( fabs( ptOne.x() - ptZero.x() )* dist ); + feat->setDistLabel( fabs( ptOne.x() - ptZero.x() )* dist * vectorScaleFactor ); } @@ -358,6 +363,10 @@ double size = 0.3527 * lyr.textFont.pointSizeF() * ctx.scaleFactor(); //* ctx.rasterScaleFactor(); lyr.textFont.setPixelSize(( int )size ); + //raster and vector scale factors + lyr.vectorScaleFactor = ctx.scaleFactor(); + lyr.rasterCompressFactor = ctx.rasterScaleFactor(); + // save the pal layer to our layer context (with some additional info) lyr.palLayer = l; lyr.fieldIndex = fldIndex; @@ -579,12 +588,17 @@ painter->save(); painter->translate( QPointF( outPt.x(), outPt.y() ) ); painter->rotate( -label->getAlpha() * 180 / M_PI ); - painter->translate( QPointF( 1, -1 - lyr.fontBaseline ) ); + painter->translate( QPointF( lyr.vectorScaleFactor *( 1 + lyr.bufferSize ), -lyr.vectorScaleFactor *( 1 + lyr.bufferSize ) - lyr.fontBaseline ) ); + //request larger font and scale down painter (to avoid Qt font scale bug) + QFont labelFont = lyr.textFont; + labelFont.setPixelSize( labelFont.pixelSize() * lyr.rasterCompressFactor ); + painter->scale( 1.0 / lyr.rasterCompressFactor, 1.0 / lyr.rasterCompressFactor ); + if ( drawBuffer ) { // we're drawing buffer - drawLabelBuffer( painter, txt, lyr.textFont, lyr.bufferSize, lyr.bufferColor ); + drawLabelBuffer( painter, txt, labelFont, lyr.bufferSize * lyr.vectorScaleFactor * lyr.rasterCompressFactor, lyr.bufferColor ); } else { @@ -594,7 +608,7 @@ painter->drawText((0,0, txt);*/ QPainterPath path; - path.addText( 0, 0, lyr.textFont, txt ); + path.addText( 0, 0, labelFont, txt ); painter->setPen( Qt::NoPen ); painter->setBrush( lyr.textColor ); painter->drawPath( path ); @@ -606,7 +620,7 @@ } -void PalLabeling::drawLabelBuffer( QPainter* p, QString text, const QFont& font, int size, QColor color ) +void PalLabeling::drawLabelBuffer( QPainter* p, QString text, const QFont& font, double size, QColor color ) { /* p->setFont( font ); @@ -618,7 +632,9 @@ QPainterPath path; path.addText( 0, 0, font, text ); - p->setPen( QPen( color, size ) ); + QPen pen( color ); + pen.setWidthF( size ); + p->setPen( pen ); p->setBrush( color ); p->drawPath( path ); } Index: src/plugins/labeling/pallabeling.h =================================================================== --- src/plugins/labeling/pallabeling.h (Revision 13534) +++ src/plugins/labeling/pallabeling.h (Arbeitskopie) @@ -60,9 +60,11 @@ bool enabled; int priority; // 0 = low, 10 = high bool obstacle; // whether it's an obstacle - double dist; // distance from the feature (in pixels) + double dist; // distance from the feature (in mm) + double vectorScaleFactor; //scale factor painter units->pixels + double rasterCompressFactor; //pixel resolution scale factor int scaleMin, scaleMax; // disabled if both are zero - int bufferSize; + double bufferSize; //buffer size (in mm) QColor bufferColor; bool labelPerPart; // whether to label every feature's part or only the biggest one bool mergeLines; @@ -139,7 +141,7 @@ void drawLabelCandidateRect( pal::LabelPosition* lp, QPainter* painter, const QgsMapToPixel* xform ); void drawLabel( pal::LabelPosition* label, QPainter* painter, const QgsMapToPixel* xform, bool drawBuffer = false ); - static void drawLabelBuffer( QPainter* p, QString text, const QFont& font, int size, QColor color ); + static void drawLabelBuffer( QPainter* p, QString text, const QFont& font, double size, QColor color ); protected: Index: src/plugins/labeling/labelpreview.cpp =================================================================== --- src/plugins/labeling/labelpreview.cpp (Revision 13534) +++ src/plugins/labeling/labelpreview.cpp (Arbeitskopie) @@ -15,9 +15,9 @@ update(); } -void LabelPreview::setBuffer( int size, QColor color ) +void LabelPreview::setBuffer( double size, QColor color ) { - mBufferSize = size; + mBufferSize = size * 88 / 25.4; //assume standard dpi for preview mBufferColor = color; update(); } Index: src/plugins/labeling/labelinggui.cpp =================================================================== --- src/plugins/labeling/labelinggui.cpp (Revision 13534) +++ src/plugins/labeling/labelinggui.cpp (Arbeitskopie) @@ -41,7 +41,7 @@ connect( btnChangeFont, SIGNAL( clicked() ), this, SLOT( changeTextFont() ) ); connect( chkBuffer, SIGNAL( toggled( bool ) ), this, SLOT( updatePreview() ) ); connect( btnBufferColor, SIGNAL( clicked() ), this, SLOT( changeBufferColor() ) ); - connect( spinBufferSize, SIGNAL( valueChanged( int ) ), this, SLOT( updatePreview() ) ); + connect( spinBufferSize, SIGNAL( valueChanged( double ) ), this, SLOT( updatePreview() ) ); connect( btnEngineSettings, SIGNAL( clicked() ), this, SLOT( showEngineConfigDialog() ) ); // set placement methods page based on geometry type Index: src/plugins/labeling/labelpreview.h =================================================================== --- src/plugins/labeling/labelpreview.h (Revision 13534) +++ src/plugins/labeling/labelpreview.h (Arbeitskopie) @@ -10,7 +10,7 @@ void setTextColor( QColor color ); - void setBuffer( int size, QColor color ); + void setBuffer( double size, QColor color ); void paintEvent( QPaintEvent* e );