void DetailledPrintStyle::print( const KABC::Addressee::List &contacts, PrintProgress *progress ) { mPrintProgress = progress; progress->addMessage( i18n( "Setting up fonts and colors" ) ); progress->setProgress( 0 ); bool useKDEFonts; QFont font; QColor foreColor = Qt::black; QColor headerColor = Qt::white; bool useHeaderColor = true; QColor backColor = Qt::black; bool useBGColor; // save, always available defaults: QFont header = QFont("Helvetica", 12, QFont::Normal); QFont headlines = QFont("Helvetica", 12, QFont::Normal, true); QFont body = QFont("Helvetica", 12, QFont::Normal); QFont fixed = QFont("Courier", 12, QFont::Normal); QFont comment = QFont("Helvetica", 10, QFont::Normal); // store the configuration settings: KConfig *config = kapp->config(); config->setGroup( ConfigSectionName ); useKDEFonts = mPageAppearance->cbStandardFonts->isChecked(); config->writeEntry( UseKDEFonts, useKDEFonts ); // read the font and color selections from the wizard pages: useBGColor=mPageAppearance->cbBackgroundColor->isChecked(); config->writeEntry( ColoredContactHeaders, useBGColor ); // use colored contact headers, otherwise use plain black and white): if ( useBGColor ) { headerColor = mPageAppearance->kcbHeaderTextColor->color(); backColor = mPageAppearance->kcbHeaderBGColor->color(); config->writeEntry( ContactHeaderForeColor, headerColor ); config->writeEntry( ContactHeaderBGColor, backColor ); } if ( mPageAppearance->cbStandardFonts->isChecked() ) { QFont standard = KGlobalSettings::generalFont(); header = standard; headlines = standard; body = standard; fixed = KGlobalSettings::fixedFont(); comment = standard; } else { header.setFamily( mPageAppearance->kfcHeaderFont->currentText() ); header.setPointSize( mPageAppearance->kisbHeaderFontSize->value() ); config->writeEntry( HeaderFont, header ); // headlines: headlines.setFamily( mPageAppearance->kfcHeadlineFont->currentText() ); headlines.setPointSize( mPageAppearance->kisbHeadlineFontSize->value() ); config->writeEntry( HeadlinesFont, headlines ); // body: body.setFamily( mPageAppearance->kfcBodyFont->currentText() ); body.setPointSize( mPageAppearance->kisbBodyFontSize->value() ); config->writeEntry( BodyFont, body ); // details: comment.setFamily( mPageAppearance->kfcDetailsFont->currentText() ); comment.setPointSize( mPageAppearance->kisbDetailsFontSize->value() ); config->writeEntry( DetailsFont, comment ); // fixed: fixed.setFamily( mPageAppearance->kfcFixedFont->currentText() ); fixed.setPointSize( mPageAppearance->kisbFixedFontSize->value() ); config->writeEntry( FixedFont, fixed ); } mPainter = new KABEntryPainter; mPainter->setForegroundColor( foreColor ); mPainter->setHeaderColor( headerColor ); mPainter->setBackgroundColor( backColor ); mPainter->setUseHeaderColor( useHeaderColor ); mPainter->setHeaderFont( header ); mPainter->setHeadLineFont( headlines ); mPainter->setBodyFont( body ); mPainter->setFixedFont( fixed ); mPainter->setCommentFont( comment ); KPrinter *printer = wizard()->printer(); QPainter painter; progress->addMessage( i18n( "Setting up margins and spacing" ) ); int marginTop = 0, marginLeft = 64, // to allow stapling, need refinement with two-side prints marginRight = 0, marginBottom = 0; register int left, top, width, height; painter.begin( printer ); printer->setFullPage( true ); // use whole page QPaintDeviceMetrics metrics( printer ); left = QMAX( printer->margins().width(), marginLeft ); top = QMAX( printer->margins().height(), marginTop ); width = metrics.width() - left - QMAX( printer->margins().width(), marginRight ); height = metrics.height() - top - QMAX( printer->margins().height(), marginBottom ); painter.setViewport( left, top, width, height ); progress->addMessage( i18n( "Printing" ) ); printEntries( contacts, printer, &painter, QRect( 0, 0, metrics.width(), metrics.height() ) ); progress->addMessage( i18n( "Done" ) ); painter.end(); config->sync(); }
void TopLevel::printIt( KPrinter &printer, QPainter &painter ) { QPaintDeviceMetrics dm(painter.device()); QApplication::setOverrideCursor( waitCursor ); kapp->processEvents(); const bool fullpage = printer.option(APP_KFAX_SCALE_FULLPAGE) == "true"; const bool center_h = printer.option(APP_KFAX_CENTER_HORZ) == "true"; const bool center_v = printer.option(APP_KFAX_CENTER_VERT) == "true"; int currentpage = 0; bool first_page_printed = false; struct pagenode *pn; for(pn = firstpage; pn; pn = pn->next) { ++currentpage; // should this page be printed ? if (printer.pageList().findIndex(currentpage) < 0) continue; XImage *Image = Pimage(pn); if (!Image) continue; // byte-swapping the image QByteArray bytes( Image->height*Image->bytes_per_line ); for (int y=Image->height-1; y>=0; --y) { Q_UINT32 offset = y*Image->bytes_per_line; Q_UINT32 *source = (Q_UINT32 *) (Image->data + offset); Q_UINT32 *dest = (Q_UINT32 *) (bytes.data() + offset); for (int x=(Image->bytes_per_line/4)-1; x>=0; --x) { Q_UINT32 dv = 0, sv = *source; for (int bit=32; bit>0; --bit) { dv <<= 1; dv |= sv&1; sv >>= 1; } *dest = dv; ++dest; ++source; } } QImage image( (uchar *)bytes.data(), Image->bytes_per_line*8, Image->height, 1, NULL, 2, QImage::LittleEndian); if (first_page_printed) printer.newPage(); first_page_printed = true; const QSize printersize( dm.width(), dm.height() ); kdDebug() << "Printersize = " << printersize << endl; // print Image in original size if possible, else scale it. const QSize size( // logical size of the image Image->width * dm.logicalDpiX() / pn->dpiX, Image->height * dm.logicalDpiY() / pn->dpiY ); kdDebug() << "Org image size = " << Image->width << "x" << Image->height << " logical picture res = " << pn->dpiX << "x" << pn->dpiY << endl; kdDebug() << "New image size = " << size << " logical printer res = " << dm.logicalDpiX() << "x" << dm.logicalDpiY() << endl; uint top, left, bottom, right; if (fullpage) top = left = bottom = right = 0; else printer.margins( &top, &left, &bottom, &right ); kdDebug() << "Margins = " << top << " " << left << " " << bottom << " " << right << endl; const QSize maxSize( printersize.width()-left-right, printersize.height()-top-bottom ); QSize scaledImageSize = size; if (size.width() > maxSize.width() || size.height() > maxSize.height() ) { // Image does not fit - scale it and print centered scaledImageSize.scale( maxSize, QSize::ScaleMin ); kdDebug() << "Image does not fit - scaling to " << maxSize << endl; } else { // Image does fit - print it in original size, but centered scaledImageSize.scale( size, QSize::ScaleMin ); kdDebug() << "Image does fit - scaling to " << size << endl; } kdDebug() << "Final image size " << scaledImageSize << endl; int x,y; if (center_h) x = (maxSize.width()-scaledImageSize.width())/2 + left; else x = left; if (center_v) y = (maxSize.height()-scaledImageSize.height())/2 + top; else y = top; painter.drawImage( QRect(x,y,scaledImageSize.width(), scaledImageSize.height()), image ); } QApplication::restoreOverrideCursor(); }