font size fixe in Postscript

git-svn-id: http://svn.osgeo.org/qgis/trunk@3081 c8812cc2-4d05-0410-92ff-de0c093fc19c
This commit is contained in:
rabla 2005-04-05 09:23:32 +00:00
parent 4091c88aaa
commit 636887b054
6 changed files with 67 additions and 56 deletions

View File

@ -252,7 +252,7 @@ void QgsComposer::print(void)
double scale = resolution / 25.4 / mComposition->scale();
mComposition->setPlotStyle ( QgsComposition::Print );
mComposition->setPlotStyle ( QgsComposition::Postscript );
if ( mPrinter->outputToFile() ) {
std::cout << "Print to file" << std::endl;

View File

@ -115,22 +115,20 @@ void QgsComposerLabel::draw ( QPainter & painter )
{
std::cout << "QgsComposerLabel::render" << std::endl;
int size = (int) ( 25.4 * mComposition->scale() * mFont.pointSize() / 72);
QFont font ( mFont );
font.setPointSize ( size );
float size = 25.4 * mComposition->scale() * mFont.pointSizeFloat() / 72;
QFontMetrics metrics ( font );
QFont font ( mFont );
font.setPointSizeFloat ( size );
// Fonts for rendering
// It seems that font pointSize is used in points in Postscript, that means it depends
// on resolution!
if ( plotStyle() == QgsComposition::Print ) {
size = (int) ( 72.0 * size / mComposition->resolution() );
}
font.setPointSize ( size );
// I have no idea why 2.54 - it is an empirical value
if ( plotStyle() == QgsComposition::Postscript ) {
size = 2.54 * 72.0 * mFont.pointSizeFloat() / mComposition->resolution();
}
font.setPointSizeFloat ( size );
// Not sure about Style Strategy, QFont::PreferMatch ?
font.setStyleStrategy ( (QFont::StyleStrategy) (QFont::PreferOutline | QFont::PreferAntialias ) );
@ -139,13 +137,17 @@ void QgsComposerLabel::draw ( QPainter & painter )
int x = (int) QCanvasPolygonalItem::x();
int y = (int) QCanvasPolygonalItem::y();
int w = metrics.width ( mText );
int h = metrics.height();
//painter.drawText( (int)(x-w/2), (int)(y+h/2), mText );
QRect r = boundingRect();
/*
QBrush brush ( QColor(255,255,255) );
painter.setBrush ( brush );
painter.drawRect ( r );
*/
painter.drawText ( r, Qt::AlignCenter|Qt::SingleLine , mText );
//painter.drawText ( r.x(), (int)(r.y()+r.height()), mText );
// Show selected / Highlight
if ( mSelected && plotStyle() == QgsComposition::Preview ) {
@ -178,17 +180,23 @@ QRect QgsComposerLabel::boundingRect ( void ) const
{
// Recalculate sizes according to current font size
int size = (int) ( 25.4 * mComposition->scale() * mFont.pointSize() / 72);
float size = 25.4 * mComposition->scale() * mFont.pointSize() / 72;
QFont font ( mFont );
font.setPointSize ( size );
font.setPointSizeFloat ( size );
QFontMetrics metrics ( font );
int x = (int) QCanvasPolygonalItem::x();
int y = (int) QCanvasPolygonalItem::y();
int w = metrics.width ( mText );
int h = metrics.height();
QRect r ( (int)(x - w/2), (int) (y - h/2), w, h );
int h = metrics.height() ;
// make the buffer bigger because the output in Postscript can be different
int buf = (int) (size / 20 * mComposition->scale());
QRect r ( (int)(x - w/2 - buf), (int) (y - h/2), w+2*buf, h );
return r;
}

View File

@ -137,7 +137,7 @@ void QgsComposerMap::draw ( QPainter *painter, QgsRect *extent, QgsMapToPixel *t
if ( vector->labelOn() ) {
double fontScale = 25.4 * mFontScale * mComposition->scale() / 72;
if ( plotStyle() == QgsComposition::Print ) {
if ( plotStyle() == QgsComposition::Postscript ) {
fontScale *= 72.0 / mComposition->resolution();
}
vector->drawLabels ( painter, extent, transform, device, fontScale );
@ -227,7 +227,8 @@ void QgsComposerMap::draw ( QPainter & painter )
painter.restore();
} else if ( (plotStyle() == QgsComposition::Preview && mPreviewMode == Render) ||
plotStyle() == QgsComposition::Print )
plotStyle() == QgsComposition::Print ||
plotStyle() == QgsComposition::Postscript )
{
std::cout << "render" << std::endl;

View File

@ -211,21 +211,20 @@ QRect QgsComposerScalebar::render ( QPainter *p )
// Font size in canvas units
int size = (int) ( 25.4 * mComposition->scale() * mFont.pointSize() / 72);
float size = 25.4 * mComposition->scale() * mFont.pointSizeFloat() / 72;
// Metrics
QFont font ( mFont );
font.setPointSize ( size );
font.setPointSizeFloat ( size );
QFontMetrics metrics ( font );
// Fonts for rendering
// It seems that font pointSize is used in points in Postscript, that means it depends
// on resolution!
if ( plotStyle() == QgsComposition::Print ) {
size = (int) ( 72.0 * size / mComposition->resolution() );
// I have no idea why 2.54 - it is an empirical value
if ( plotStyle() == QgsComposition::Postscript ) {
size = 2.54 * 72.0 * mFont.pointSizeFloat() / mComposition->resolution();
}
font.setPointSize ( size );
font.setPointSizeFloat ( size );
// Not sure about Style Strategy, QFont::PreferMatch?
font.setStyleStrategy ( (QFont::StyleStrategy) (QFont::PreferOutline | QFont::PreferAntialias) );

View File

@ -192,9 +192,9 @@ QRect QgsComposerVectorLegend::render ( QPainter *p )
std::cout << "mComposition->scale() = " << mComposition->scale() << std::endl;
// Font size in canvas units
int titleSize = (int) ( 25.4 * mComposition->scale() * mTitleFont.pointSize() / 72);
int sectionSize = (int) ( 25.4 * mComposition->scale() * mSectionFont.pointSize() / 72);
int size = (int) ( 25.4 * mComposition->scale() * mFont.pointSize() / 72);
float titleSize = 25.4 * mComposition->scale() * mTitleFont.pointSizeFloat() / 72;
float sectionSize = 25.4 * mComposition->scale() * mSectionFont.pointSizeFloat() / 72;
float size = 25.4 * mComposition->scale() * mFont.pointSizeFloat() / 72;
std::cout << "font sizes = " << titleSize << " " << sectionSize << " " << size << std::endl;
@ -203,27 +203,26 @@ QRect QgsComposerVectorLegend::render ( QPainter *p )
QFont sectionFont ( mSectionFont );
QFont font ( mFont );
titleFont.setPointSize ( titleSize );
sectionFont.setPointSize ( sectionSize );
font.setPointSize ( size );
titleFont.setPointSizeFloat ( titleSize );
sectionFont.setPointSizeFloat ( sectionSize );
font.setPointSizeFloat ( size );
QFontMetrics titleMetrics ( titleFont );
QFontMetrics sectionMetrics ( sectionFont );
QFontMetrics metrics ( font );
// Fonts for rendering
// It seems that font pointSize is used in points in Postscript, that means it depends
// on resolution!
if ( plotStyle() == QgsComposition::Print ) {
titleSize = (int) ( 72.0 * titleSize / mComposition->resolution() );
sectionSize = (int) ( 72.0 * sectionSize / mComposition->resolution() );
size = (int) ( 72.0 * size / mComposition->resolution() );
// I have no idea why 2.54 - it is an empirical value
if ( plotStyle() == QgsComposition::Postscript) {
titleSize = 2.54 * 72.0 * mTitleFont.pointSizeFloat() / mComposition->resolution();
sectionSize = 2.54 * 72.0 * mSectionFont.pointSizeFloat() / mComposition->resolution();
size = 2.54 * 72.0 * mFont.pointSizeFloat() / mComposition->resolution();
}
titleFont.setPointSize ( titleSize );
sectionFont.setPointSize ( sectionSize );
font.setPointSize ( size );
titleFont.setPointSizeFloat ( titleSize );
sectionFont.setPointSizeFloat ( sectionSize );
font.setPointSizeFloat ( size );
// Not sure about Style Strategy, QFont::PreferMatch?
titleFont.setStyleStrategy ( (QFont::StyleStrategy) (QFont::PreferOutline | QFont::PreferAntialias) );
@ -430,10 +429,12 @@ QRect QgsComposerVectorLegend::render ( QPainter *p )
lab = itemLabels[icnt];
}
// drawText (x, y w, h, ...) was cutting last letter (the box was tto small)
QRect br = metrics.boundingRect ( lab );
x = (int) ( 2*mMargin + mSymbolWidth );
y = (int) ( localHeight + symbolHeight/2 - br.height()/2 );
painter->drawText( x, y, br.width(), br.height(), Qt::AlignLeft|Qt::AlignVCenter, lab );
y = (int) ( localHeight + symbolHeight/2 + ( metrics.height()/2 - metrics.descent()) );
painter->drawText( x, y, lab );
int w = 3*mMargin + mSymbolWidth + metrics.width(lab);
if ( w > width ) width = w;
@ -514,7 +515,8 @@ void QgsComposerVectorLegend::draw ( QPainter & painter )
painter.restore();
} else if ( (plotStyle() == QgsComposition::Preview && mPreviewMode == Render) ||
plotStyle() == QgsComposition::Print )
plotStyle() == QgsComposition::Print ||
plotStyle() == QgsComposition::Postscript )
{
std::cout << "render" << std::endl;
@ -611,15 +613,15 @@ void QgsComposerVectorLegend::recalculate ( void )
// Title and section font
mTitleFont = mFont;
mTitleFont.setPointSize ( (int) (1.4 * mFont.pointSize()) );
mTitleFont.setPointSizeFloat ( 1.4 * mFont.pointSizeFloat());
mSectionFont = mFont;
mSectionFont.setPointSize ( (int) (1.2 * mFont.pointSize()) );
mSectionFont.setPointSizeFloat ( 1.2 * mFont.pointSizeFloat() );
std::cout << "font size = " << mFont.pointSize() << std::endl;
std::cout << "title font size = " << mTitleFont.pointSize() << std::endl;
std::cout << "font size = " << mFont.pointSizeFloat() << std::endl;
std::cout << "title font size = " << mTitleFont.pointSizeFloat() << std::endl;
// Font size in canvas units
int size = (int) ( 25.4 * mComposition->scale() * mFont.pointSize() / 72);
float size = 25.4 * mComposition->scale() * mFont.pointSizeFloat() / 72;
mMargin = (int) ( 0.9 * size );
mSymbolHeight = (int) ( 1.3 * size );

View File

@ -93,7 +93,8 @@ public:
/** \brief Plot type */
enum PlotStyle {
Preview = 0, // Use cache etc
Print // Render well
Print, // Render well
Postscript // Fonts need different scaling!
};
/** \brief Composition ID */