void TopLevel::newPage(){ if(!display_is_setup) SetupDisplay(); XDefineCursor(qtdisplay, Win, WorkCursor); XFlush(qtdisplay); freeImages(); int k = -1; if(!thispage) { XDefineCursor(qtdisplay, Win, ReadyCursor); return; } if (Pimage(thispage) == NULL){ while((k != 0) && (k != 3) && (k !=1)) k = GetImage(thispage); } if (k == 3 ){ XDefineCursor(qtdisplay, Win, ReadyCursor); FreeFax(); /* KMessageBox::sorry(i18n("Bad fax file k=3"));*/ return; } if (k == 0 ){ XDefineCursor(qtdisplay, Win, ReadyCursor); FreeFax(); /* KMessageBox::sorry(i18n("Bad fax file k=0"));*/ return; } Image = Images[0] = Pimage(thispage); setCaption(QFile::decodeName(thispage->name)); Image = generateZoomImages(oz); PaneWidth = Image->width; PaneHeight = Image->height; Refresh = 1; XDefineCursor(qtdisplay, Win, ReadyCursor); uiUpdate(); }
/* Change orientation of all following pages */ void TurnFollowing(int How, struct pagenode *pn) { while (pn) { if (Pimage(pn)) { FreeImage(Pimage(pn)); pn->extra = NULL; } pn->orient ^= How; pn = pn->next; } }
static void drawline(pixnum *run, int LineNum, struct pagenode *pn) { t32bits *p, *p1; /* p - current line, p1 - low-res duplicate */ pixnum *r; /* pointer to run-lengths */ t32bits pix; /* current pixel value */ t32bits acc; /* pixel accumulator */ int nacc; /* number of valid bits in acc */ int tot; /* total pixels in line */ int n; LineNum += pn->stripnum * pn->rowsperstrip; p = (t32bits *) (Pimage(pn)->data + LineNum*(2-pn->vres)*Pimage(pn)->bytes_per_line); p1 =(t32bits *)( pn->vres ? NULL : p + Pimage(pn)->bytes_per_line/sizeof(*p)); r = run; acc = 0; nacc = 0; pix = pn->inverse ? ~0 : 0; tot = 0; while (tot < pn->width) { n = *r++; tot += n; if (pix) acc |= (~(t32bits)0 >> nacc); else if (nacc) acc &= (~(t32bits)0 << (32 - nacc)); else acc = 0; if (nacc + n < 32) { nacc += n; pix = ~pix; continue; } *p++ = acc; if (p1) *p1++ = acc; n -= 32 - nacc; while (n >= 32) { n -= 32; *p++ = pix; if (p1) *p1++ = pix; } acc = pix; nacc = n; pix = ~pix; }
void TopLevel::FreeFax() { if(display_is_setup) XClearWindow(qtdisplay, Win); freeImages(); pagenode *pn; for (pn = firstpage; pn; pn = pn->next){ if(Pimage(pn)){ FreeImage(Pimage(pn)); pn->extra = NULL; } } Image = NULL; for (pn = firstpage; pn; pn = pn->next){ if(pn->pathname){ free(pn->pathname); } } if(firstpage){ for(pn = firstpage->next; pn; pn = pn->next){ if(pn->prev){ free(pn->prev); } } } if(lastpage) free(lastpage); firstpage = lastpage = viewpage = thispage = auxpage = NULL; uiUpdate(); }
bool TopLevel::loadAllPages( int &numpages, int ¤tpage ) { struct pagenode *pn; numpages = 0; currentpage = 1; for(pn = firstpage; pn; pn = pn->next) { ++numpages; if (pn == thispage) currentpage = numpages; if (!Pimage(pn)) { int k = -1; while((k != 0) && (k != 3) && (k != 1)) k = GetImage(pn); // fetch image if it is not available yet. } } return (numpages != 0); }
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(); }