void PictureImage::draw(QPainter& painter, int x, int y, int width, int height, int sx, int sy, int sw, int sh, bool fastMode) { //kDebug(30508) <<"KoImage::draw currentSize:" << currentSize.width() <<"x" << currentSize.height(); if (!width || !height) return; QSize origSize = getOriginalSize(); const bool scaleImage = dynamic_cast<QPrinter*>(painter.device()) != 0 // we are printing && ((width <= origSize.width()) || (height <= origSize.height())); if (scaleImage) { // use full resolution of image qreal xScale = qreal(width) / qreal(origSize.width()); qreal yScale = qreal(height) / qreal(origSize.height()); painter.save(); painter.translate(x, y); painter.scale(xScale, yScale); // Note that sx, sy, sw and sh are unused in this case. Not a problem, since it's about printing. // Note 2: we do not cache the QPixmap. As we are printing, the next time we will probably // need again the screen version. painter.drawImage(0, 0, m_originalImage); painter.restore(); } else { QSize screenSize(width, height); //kDebug(30508) <<"PictureImage::draw screenSize=" << screenSize.width() <<"x" << screenSize.height(); scaleAndCreatePixmap(screenSize, fastMode); // sx,sy,sw,sh is meant to be used as a cliprect on the pixmap, but drawPixmap // translates it to the (x,y) point -> we need (x+sx, y+sy). painter.drawPixmap(x + sx, y + sy, m_cachedPixmap, sx, sy, sw, sh); } }
void KoPictureEps::draw(QPainter& painter, int x, int y, int width, int height, int sx, int sy, int sw, int sh, bool fastMode) { if ( !width || !height ) return; QSize screenSize( width, height ); //kdDebug() << "KoPictureEps::draw screenSize=" << screenSize.width() << "x" << screenSize.height() << endl; QPaintDeviceMetrics metrics (painter.device()); kdDebug(30003) << "Metrics: X: " << metrics.logicalDpiX() << " x Y: " << metrics.logicalDpiX() << " (in KoPictureEps::draw)" << endl; if ( painter.device()->isExtDev() ) // Is it an external device (i.e. printer) { kdDebug(30003) << "Drawing for a printer (in KoPictureEps::draw)" << endl; // For printing, always re-sample the image, as a printer has never the same resolution than a display. QImage image( scaleWithGhostScript( screenSize, metrics.logicalDpiX(), metrics.logicalDpiY() ) ); // sx,sy,sw,sh is meant to be used as a cliprect on the pixmap, but drawImage // translates it to the (x,y) point -> we need (x+sx, y+sy). painter.drawImage( x + sx, y + sy, image, sx, sy, sw, sh ); } else // No, it is simply a display { scaleAndCreatePixmap(screenSize, fastMode, metrics.logicalDpiX(), metrics.logicalDpiY() ); // sx,sy,sw,sh is meant to be used as a cliprect on the pixmap, but drawPixmap // translates it to the (x,y) point -> we need (x+sx, y+sy). painter.drawPixmap( x + sx, y + sy, m_cachedPixmap, sx, sy, sw, sh ); } }
QPixmap PictureImage::generatePixmap(const QSize& size, bool smoothScale) { scaleAndCreatePixmap(size, !smoothScale); return m_cachedPixmap; }
QPixmap KoPictureEps::generatePixmap(const QSize& size, bool smoothScale) { scaleAndCreatePixmap(size,!smoothScale, 0, 0); return m_cachedPixmap; }