68 const QString &fileNamePrefix,
69 const QString &fileNameSuffix,
70 const QByteArray &outputMimeType,
72 const int sequenceNumberingOffset,
73 const bool onlyNeedsUniqueFrames,
75 : m_d(new
Private(image, range, sequenceNumberingOffset, onlyNeedsUniqueFrames, exportConfiguration))
77 m_d->filenamePrefix = fileNamePrefix;
78 m_d->filenameSuffix = fileNameSuffix;
79 m_d->outputMimeType = outputMimeType;
106 QString frameNumber = QString(
"%1").arg(frame +
m_d->sequenceNumberingOffset, 4, 10, QChar(
'0'));
107 QString filename =
m_d->filenamePrefix + frameNumber +
m_d->filenameSuffix;
109 if (!
m_d->savingDoc->exportDocumentSync(filename,
m_d->outputMimeType,
m_d->exportConfiguration)) {
116 identicals &=
m_d->range;
117 if( !
m_d->onlyNeedsUniqueFrames && identicals.
start() < identicals.
end() ) {
118 for (
int identicalFrame = (identicals.
start() + 1); identicalFrame <= identicals.
end(); identicalFrame++) {
119 QString identicalFrameNumber = QString(
"%1").arg(identicalFrame +
m_d->sequenceNumberingOffset, 4, 10, QChar(
'0'));
120 QString identicalFrameName =
m_d->filenamePrefix + identicalFrameNumber +
m_d->filenameSuffix;
123 QString copyErrorMessage;
127 QFile sourceFile(filename);
128 if (sourceFile.copy(identicalFrameName)) {
132 copyErrorMessage = sourceFile.errorString();
136 warnFile.nospace() <<
"Failed to copy frame '" << filename <<
"' to '" << identicalFrameName
137 <<
"': " << copyErrorMessage;
PythonPluginManager * instance
void frameCancelledCallback(int frame, CancelReason cancelReason) override
frameCancelledCallback is called when the rendering of the frame was cancelled.
void sigCancelRegenerationInternal(int frame, KisAsyncAnimationRendererBase::CancelReason cancelReason)
const QScopedPointer< Private > m_d
void frameCompletedCallback(int frame, const KisRegion &requestedRegion) override
frameCompletedCallback is called by the renderer when a new frame becomes ready
KisAsyncAnimationFramesSavingRenderer(KisImageSP image, const QString &fileNamePrefix, const QString &fileNameSuffix, const QByteArray &outputMimeType, const KisTimeSpan &range, const int sequenceNumberingOffset, const bool onlyNeedsUniqueFrames, KisPropertiesConfigurationSP exportConfiguration)
~KisAsyncAnimationFramesSavingRenderer()
void sigCompleteRegenerationInternal(int frame)
const KoColorSpace * colorSpace() const
KisPaintDeviceSP projection() const
QRect bounds() const override
void setResolution(double xres, double yres)
static KisTimeSpan calculateIdenticalFramesRecursive(const KisNode *node, int time)
#define KIS_SAFE_ASSERT_RECOVER(cond)
KisDocument * createDocument(QList< KisNodeSP > nodes, KisImageSP srcImage, const QRect &copiedBounds)
bool copyFile(const QString &inputPath, const QString &outputPath, QString *outErrorMessage)
QScopedPointer< KisDocument > savingDoc
KisPropertiesConfigurationSP exportConfiguration
bool onlyNeedsUniqueFrames
QByteArray outputMimeType
KisPaintDeviceSP savingDevice
Private(KisImageSP image, const KisTimeSpan &_range, int _sequenceNumberingOffset, bool _onlyNeedsUniqueFrames, KisPropertiesConfigurationSP _exportConfiguration)
int sequenceNumberingOffset
KisImageSP requestedImage
void notifyFrameCompleted(int frame)
void notifyFrameCancelled(int frame, KisAsyncAnimationRendererBase::CancelReason cancelReason)
KisRegion requestedRegion
bool addNode(KisNodeSP node, KisNodeSP parent=KisNodeSP(), KisNodeAdditionFlags flags=KisNodeAdditionFlag::None)
KisPaintDeviceSP paintDevice