KDE_EXPORT void kimgio_eps_read(QImageIO *image) { kdDebug(399) << "kimgio EPS: starting..." << endl; FILE *ghostfd; int x1, y1, x2, y2; // QTime dt; // dt.start(); QString cmdBuf; QString tmp; QIODevice *io = image->ioDevice(); Q_UINT32 ps_offset, ps_size; // find start of PostScript code if(!seekToCodeStart(io, ps_offset, ps_size)) return; // find bounding box if(!bbox(io, &x1, &y1, &x2, &y2)) { kdError(399) << "kimgio EPS: no bounding box found!" << endl; return; } KTempFile tmpFile; tmpFile.setAutoDelete(true); if(tmpFile.status() != 0) { kdError(399) << "kimgio EPS: no temp file!" << endl; return; } tmpFile.close(); // Close the file, we just want the filename // x1, y1 -> translation // x2, y2 -> new size x2 -= x1; y2 -= y1; // kdDebug(399) << "origin point: " << x1 << "," << y1 << " size:" << x2 << "," << y2 << endl; double xScale = 1.0; double yScale = 1.0; bool needsScaling = false; int wantedWidth = x2; int wantedHeight = y2; if(image->parameters()) { // Size forced by the caller QStringList params = QStringList::split(':', image->parameters()); if(params.count() >= 2 && x2 != 0.0 && y2 != 0.0) { wantedWidth = params[0].toInt(); xScale = (double)wantedWidth / (double)x2; wantedHeight = params[1].toInt(); yScale = (double)wantedHeight / (double)y2; // kdDebug(399) << "wanted size:" << wantedWidth << "x" << wantedHeight << endl; // kdDebug(399) << "scaling:" << xScale << "," << yScale << endl; needsScaling = true; } } // create GS command line cmdBuf = "gs -sOutputFile="; cmdBuf += tmpFile.name(); cmdBuf += " -q -g"; tmp.setNum(wantedWidth); cmdBuf += tmp; tmp.setNum(wantedHeight); cmdBuf += "x"; cmdBuf += tmp; cmdBuf += " -dSAFER -dPARANOIDSAFER -dNOPAUSE -sDEVICE=ppm -c " "0 0 moveto " "1000 0 lineto " "1000 1000 lineto " "0 1000 lineto " "1 1 254 255 div setrgbcolor fill " "0 0 0 setrgbcolor - -c showpage quit"; // run ghostview ghostfd = popen(QFile::encodeName(cmdBuf), "w"); if(ghostfd == 0) { kdError(399) << "kimgio EPS: no GhostScript?" << endl; return; } fprintf(ghostfd, "\n%d %d translate\n", -qRound(x1 * xScale), -qRound(y1 * yScale)); if(needsScaling) fprintf(ghostfd, "%g %g scale\n", xScale, yScale); // write image to gs io->reset(); // Go back to start of file to give all the file to GhostScript if(ps_offset > 0L) // We have an offset io->at(ps_offset); QByteArray buffer(io->readAll()); // If we have no MS-DOS EPS file or if the size seems wrong, then choose the buffer size if(ps_size <= 0L || ps_size > buffer.size()) ps_size = buffer.size(); fwrite(buffer.data(), sizeof(char), ps_size, ghostfd); buffer.resize(0); pclose(ghostfd); // load image QImage myimage; if(myimage.load(tmpFile.name())) { image->setImage(myimage); image->setStatus(0); kdDebug(399) << "kimgio EPS: success!" << endl; } else kdError(399) << "kimgio EPS: no image!" << endl; // kdDebug(399) << "Loading EPS took " << (float)(dt.elapsed()) / 1000 << " seconds" << endl; return; }
bool EPSHandler::read(QImage *image) { kDebug(399) << "kimgio EPS: starting..."; FILE * ghostfd; int x1, y1, x2, y2; //QTime dt; //dt.start(); QString cmdBuf; QString tmp; QIODevice* io = device(); quint32 ps_offset, ps_size; // find start of PostScript code if ( !seekToCodeStart(io, ps_offset, ps_size) ) return false; // find bounding box if ( !bbox (io, &x1, &y1, &x2, &y2)) { kError(399) << "kimgio EPS: no bounding box found!" << endl; return false; } QTemporaryFile tmpFile; if( !tmpFile.open() ) { kError(399) << "kimgio EPS: no temp file!" << endl; return false; } // x1, y1 -> translation // x2, y2 -> new size x2 -= x1; y2 -= y1; //kDebug(399) << "origin point: " << x1 << "," << y1 << " size:" << x2 << "," << y2; double xScale = 1.0; double yScale = 1.0; int wantedWidth = x2; int wantedHeight = y2; // create GS command line cmdBuf = "gs -sOutputFile="; cmdBuf += tmpFile.fileName(); cmdBuf += " -q -g"; tmp.setNum( wantedWidth ); cmdBuf += tmp; tmp.setNum( wantedHeight ); cmdBuf += 'x'; cmdBuf += tmp; cmdBuf += " -dSAFER -dPARANOIDSAFER -dNOPAUSE -sDEVICE=ppm -c " "0 0 moveto " "1000 0 lineto " "1000 1000 lineto " "0 1000 lineto " "1 1 254 255 div setrgbcolor fill " "0 0 0 setrgbcolor - -c showpage quit"; // run ghostview ghostfd = popen (QFile::encodeName(cmdBuf), "w"); if ( ghostfd == 0 ) { kError(399) << "kimgio EPS: no GhostScript?" << endl; return false; } fprintf (ghostfd, "\n%d %d translate\n", -qRound(x1*xScale), -qRound(y1*yScale)); // write image to gs io->reset(); // Go back to start of file to give all the file to GhostScript if (ps_offset>0L) // We have an offset io->seek(ps_offset); QByteArray buffer ( io->readAll() ); // If we have no MS-DOS EPS file or if the size seems wrong, then choose the buffer size if (ps_size<=0 || ps_size>(unsigned int)buffer.size()) ps_size=buffer.size(); fwrite(buffer.data(), sizeof(char), ps_size, ghostfd); buffer.resize(0); pclose ( ghostfd ); // load image if( image->load (tmpFile.fileName()) ) { kDebug(399) << "kimgio EPS: success!"; //kDebug(399) << "Loading EPS took " << (float)(dt.elapsed()) / 1000 << " seconds"; return true; } kError(399) << "kimgio EPS: no image!" << endl; return false; }