diff --git a/src/KChart/KChartChart.cpp b/src/KChart/KChartChart.cpp --- a/src/KChart/KChartChart.cpp +++ b/src/KChart/KChartChart.cpp @@ -1344,65 +1344,36 @@ return d->globalLeadingBottom; } -void Chart::paint( QPainter* painter, const QRect& target ) +void Chart::paint( QPainter* painter, const QRect& rect ) { - if ( target.isEmpty() || !painter ) { + if ( rect.isEmpty() || !painter ) { return; } QPaintDevice* prevDevice = GlobalMeasureScaling::paintDevice(); GlobalMeasureScaling::setPaintDevice( painter->device() ); + int prevScaleFactor = PrintingParameters::scaleFactor(); - // Output on a widget - if ( dynamic_cast< QWidget* >( painter->device() ) != nullptr ) { - GlobalMeasureScaling::setFactors( qreal( target.width() ) / qreal( geometry().size().width() ), - qreal( target.height() ) / qreal( geometry().size().height() ) ); - } else { + if ( dynamic_cast< QWidget* >( painter->device() ) == 0 ) { // Output onto a QPixmap PrintingParameters::setScaleFactor( qreal( painter->device()->logicalDpiX() ) / qreal( logicalDpiX() ) ); - - const qreal resX = qreal( logicalDpiX() ) / qreal( painter->device()->logicalDpiX() ); - const qreal resY = qreal( logicalDpiY() ) / qreal( painter->device()->logicalDpiY() ); - - GlobalMeasureScaling::setFactors( qreal( target.width() ) / qreal( geometry().size().width() ) * resX, - qreal( target.height() ) / qreal( geometry().size().height() ) * resY ); } - const QPoint translation = target.topLeft(); - painter->translate( translation ); - - // the following layout logic has the disadvantage that repeatedly calling this method can - // cause a relayout every time, but since this method's main use seems to be printing, the - // gratuitous relayouts shouldn't be much of a performance problem. - const bool differentSize = target.size() != size(); - QRect oldGeometry; - if ( differentSize ) { - oldGeometry = geometry(); - d->isPlanesLayoutDirty = true; - d->isFloatingLegendsLayoutDirty = true; - invalidateLayoutTree( d->dataAndLegendLayout ); - d->dataAndLegendLayout->setGeometry( QRect( QPoint(), target.size() ) ); - } - - d->overrideSize = target.size(); + const QRect oldGeometry( geometry() ); + if ( oldGeometry != rect ) + setGeometry( rect ); + painter->translate( rect.left(), rect.top() ); d->paintAll( painter ); - d->overrideSize = QSize(); - - if ( differentSize ) { - invalidateLayoutTree( d->dataAndLegendLayout ); - d->dataAndLegendLayout->setGeometry( oldGeometry ); - d->isPlanesLayoutDirty = true; - d->isFloatingLegendsLayoutDirty = true; - } - // for debugging + //for debugging // painter->setPen( QPen( Qt::blue, 8 ) ); - // painter->drawRect( target ); + // painter->drawRect( rect ); - painter->translate( -translation.x(), -translation.y() ); + painter->translate( -rect.left(), -rect.top() ); + if ( oldGeometry != rect ) + setGeometry( oldGeometry ); - GlobalMeasureScaling::instance()->resetFactors(); - PrintingParameters::resetScaleFactor(); + PrintingParameters::setScaleFactor( prevScaleFactor ); GlobalMeasureScaling::setPaintDevice( prevDevice ); }