File indexing completed on 2024-05-12 16:01:44

0001 /*
0002  *  SPDX-FileCopyrightText: 2017 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "KisAsyncAnimationCacheRenderer.h"
0008 
0009 #include "kis_animation_frame_cache.h"
0010 #include "kis_update_info.h"
0011 
0012 struct KisAsyncAnimationCacheRenderer::Private
0013 {
0014     KisAnimationFrameCacheSP requestedCache;
0015     KisOpenGLUpdateInfoSP requestInfo;
0016 };
0017 
0018 
0019 KisAsyncAnimationCacheRenderer::KisAsyncAnimationCacheRenderer()
0020     : m_d(new Private)
0021 {
0022     connect(this, SIGNAL(sigCompleteRegenerationInternal(int)), SLOT(slotCompleteRegenerationInternal(int)), Qt::QueuedConnection);
0023 }
0024 
0025 KisAsyncAnimationCacheRenderer::~KisAsyncAnimationCacheRenderer()
0026 {
0027 }
0028 
0029 void KisAsyncAnimationCacheRenderer::setFrameCache(KisAnimationFrameCacheSP cache)
0030 {
0031     m_d->requestedCache = cache;
0032 }
0033 
0034 void KisAsyncAnimationCacheRenderer::frameCompletedCallback(int frame, const KisRegion &requestedRegion)
0035 {
0036     KisAnimationFrameCacheSP cache = m_d->requestedCache;
0037     KisImageSP image = requestedImage();
0038     if (!cache || !image) return;
0039 
0040     m_d->requestInfo = cache->fetchFrameData(frame, image, requestedRegion);
0041     emit sigCompleteRegenerationInternal(frame);
0042 }
0043 
0044 void KisAsyncAnimationCacheRenderer::slotCompleteRegenerationInternal(int frame)
0045 {
0046     if (!isActive()) return;
0047 
0048     KIS_SAFE_ASSERT_RECOVER(m_d->requestInfo) {
0049         frameCancelledCallback(frame, RenderingFailed);
0050         return;
0051     }
0052 
0053     m_d->requestedCache->addConvertedFrameData(m_d->requestInfo, frame);
0054     notifyFrameCompleted(frame);
0055 }
0056 
0057 
0058 void KisAsyncAnimationCacheRenderer::frameCancelledCallback(int frame, CancelReason cancelReason)
0059 {
0060     notifyFrameCancelled(frame, cancelReason);
0061 }
0062 
0063 void KisAsyncAnimationCacheRenderer::clearFrameRegenerationState(bool isCancelled)
0064 {
0065     m_d->requestInfo.clear();
0066     m_d->requestedCache.clear();
0067 
0068     KisAsyncAnimationRendererBase::clearFrameRegenerationState(isCancelled);
0069 }
0070 
0071