bool Object::exportFrames1(int frameStart, int frameEnd, QMatrix view, Layer* currentLayer, QSize exportSize, QString filePath, const char* format, int quality, bool background, bool antialiasing, int gradients, QProgressDialog* progress, int progressMax, int fps, int exportFps) { int frameRepeat; int frameReminder, frameReminder1; int framePutEvery, framePutEvery1; int frameSkipEvery, frameSkipEvery1; int frameNumber; int framePerSecond; QSettings settings("Pencil","Pencil"); qreal curveOpacity = (100-settings.value("curveOpacity").toInt())/100.0; // default value is 1.0 QString extension = ""; QString formatStr = format; if ( formatStr == "PNG" || formatStr == "png") { format = "PNG"; extension = ".png"; } if ( formatStr == "JPG" || formatStr == "jpg" || formatStr == "JPEG") { format = "JPG"; extension = ".jpg"; background = true; // JPG doesn't support transparency so we have to include the background } if (filePath.endsWith(extension, Qt::CaseInsensitive)) { filePath.chop(extension.size()); } //qDebug() << "format =" << format << "extension = " << extension; qDebug() << "Exporting frames from " << frameStart << "to" << frameEnd << "at size " << exportSize; convertNFrames(fps,exportFps,&frameRepeat,&frameReminder,&framePutEvery,&frameSkipEvery); qDebug() << "fps " << fps << " exportFps " << exportFps << " frameRepeat " << frameRepeat << " frameReminder " << frameReminder << " framePutEvery " << framePutEvery << " frameSkipEvery " << frameSkipEvery; frameNumber = 0; framePerSecond = 0; frameReminder1 = frameReminder; framePutEvery1 = framePutEvery; frameSkipEvery1 = frameSkipEvery; for(int currentFrame = frameStart; currentFrame <= frameEnd ; currentFrame++) { if ( progress != NULL ) progress->setValue((currentFrame-frameStart)*progressMax/(frameEnd-frameStart)); QImage tempImage(exportSize, QImage::Format_ARGB32_Premultiplied); QPainter painter(&tempImage); // Make sure that old frame is erased before exporting a new one tempImage.fill(0x00000000); if (currentLayer->type == Layer::CAMERA) { QRect viewRect = ((LayerCamera*)currentLayer)->getViewRect(); QMatrix mapView = Editor::map( viewRect, QRectF(QPointF(0,0), exportSize) ); mapView = ((LayerCamera*)currentLayer)->getViewAtFrame(currentFrame) * mapView; painter.setWorldMatrix(mapView); } else { painter.setWorldMatrix(view); } paintImage(painter, currentFrame, background, curveOpacity, antialiasing, gradients); frameNumber++; framePerSecond++; QString frameNumberString = QString::number(frameNumber); while ( frameNumberString.length() < 4) frameNumberString.prepend("0"); tempImage.save(filePath+frameNumberString+extension, format, quality); int delta = 0; if (framePutEvery) { framePutEvery1--; if (framePutEvery1) {delta = 1;} else {framePutEvery1 = framePutEvery;} } if (frameSkipEvery) { frameSkipEvery1--; if (!frameSkipEvery1) {delta = 1;} else {frameSkipEvery1 = frameSkipEvery;} } if (frameReminder1) {frameReminder1 -= delta;} else {delta = 0;} for (int i=0; (i < frameRepeat-1+delta) && (framePerSecond < exportFps); i++) { frameNumber++; framePerSecond++; QString frameNumberLink = QString::number(frameNumber); while ( frameNumberLink.length() < 4) frameNumberLink.prepend("0"); // QFile::link(filePath+frameNumberString+extension, filePath+frameNumberLink+extension+".lnk"); tempImage.save(filePath+frameNumberLink+extension, format, quality); } if (framePerSecond == exportFps) { framePerSecond = 0; frameReminder1 = frameReminder; framePutEvery1 = framePutEvery; frameSkipEvery1 = frameSkipEvery; } } // XXX no error handling yet return true; }
bool Object::exportFrames1( ExportFrames1Parameters par ) { int frameStart = par.frameStart; int frameEnd = par.frameEnd; QTransform view = par.view; Layer* currentLayer = par.currentLayer; QSize exportSize = par.exportSize; QString filePath = par.filePath; const char* format = par.format; int quality = par.quality; bool background = par.background; bool antialiasing = par.antialiasing; QProgressDialog* progress = par.progress; int progressMax = par.progressMax; int fps = par.fps; int exportFps = par.exportFps; int frameRepeat; int frameReminder, frameReminder1; int framePutEvery, framePutEvery1; int frameSkipEvery, frameSkipEvery1; int frameNumber; int framePerSecond; QSettings settings( "Pencil", "Pencil" ); QString extension = ""; QString formatStr = format; if ( formatStr == "PNG" || formatStr == "png" ) { format = "PNG"; extension = ".png"; } if ( formatStr == "JPG" || formatStr == "jpg" || formatStr == "JPEG" ) { format = "JPG"; extension = ".jpg"; background = true; // JPG doesn't support transparency so we have to include the background } if ( filePath.endsWith( extension, Qt::CaseInsensitive ) ) { filePath.chop( extension.size() ); } //qDebug() << "format =" << format << "extension = " << extension; qDebug() << "Exporting frames from " << frameStart << "to" << frameEnd << "at size " << exportSize; convertNFrames( fps, exportFps, &frameRepeat, &frameReminder, &framePutEvery, &frameSkipEvery ); qDebug() << "fps " << fps << " exportFps " << exportFps << " frameRepeat " << frameRepeat << " frameReminder " << frameReminder << " framePutEvery " << framePutEvery << " frameSkipEvery " << frameSkipEvery; frameNumber = 0; framePerSecond = 0; frameReminder1 = frameReminder; framePutEvery1 = framePutEvery; frameSkipEvery1 = frameSkipEvery; for ( int currentFrame = frameStart; currentFrame <= frameEnd; currentFrame++ ) { if ( progress != NULL ) progress->setValue( ( currentFrame - frameStart )*progressMax / ( frameEnd - frameStart ) ); QImage tempImage( exportSize, QImage::Format_ARGB32_Premultiplied ); QPainter painter( &tempImage ); // Make sure that old frame is erased before exporting a new one tempImage.fill( 0x00000000 ); if ( currentLayer->type() == Layer::CAMERA ) { QRect viewRect = ( ( LayerCamera* )currentLayer )->getViewRect(); QTransform mapView = RectMapTransform( viewRect, QRectF( QPointF( 0, 0 ), exportSize ) ); mapView = ( ( LayerCamera* )currentLayer )->getViewAtFrame( currentFrame ) * mapView; painter.setWorldTransform( mapView ); } else { painter.setTransform( view ); } paintImage( painter, currentFrame, background, antialiasing ); frameNumber++; framePerSecond++; QString frameNumberString = QString::number( frameNumber ); while ( frameNumberString.length() < 4 ) frameNumberString.prepend( "0" ); tempImage.save( filePath + frameNumberString + extension, format, quality ); int delta = 0; if ( framePutEvery ) { framePutEvery1--; qDebug() << "-->framePutEvery1" << framePutEvery1; if ( framePutEvery1 ) { delta = 0; } else { delta = 1; framePutEvery1 = framePutEvery; } } if ( frameSkipEvery ) { frameSkipEvery1--; qDebug() << "-->frameSkipEvery1" << frameSkipEvery1; if ( frameSkipEvery1 ) { delta = 1; } else { delta = 0; frameSkipEvery1 = frameSkipEvery; } } if ( frameReminder1 ) { frameReminder1 -= delta; } else { delta = 0; } for ( int i = 0; ( i < frameRepeat - 1 + delta ) && ( framePerSecond < exportFps ); i++ ) { frameNumber++; framePerSecond++; QString frameNumberLink = QString::number( frameNumber ); while ( frameNumberLink.length() < 4 ) frameNumberLink.prepend( "0" ); tempImage.save( filePath + frameNumberLink + extension, format, quality ); } if ( framePerSecond == exportFps ) { framePerSecond = 0; frameReminder1 = frameReminder; framePutEvery1 = framePutEvery; frameSkipEvery1 = frameSkipEvery; } } // XXX no error handling yet return true; }