File indexing completed on 2024-05-19 04:29:09

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     KisAnimationFrameCacheWSP 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     KisAnimationFrameCacheSP cache = m_d->requestedCache;
0054     if (!cache) {
0055         frameCancelledCallback(frame, UserCancelled);
0056         return;
0057     }
0058 
0059     cache->addConvertedFrameData(m_d->requestInfo, frame);
0060     notifyFrameCompleted(frame);
0061 }
0062 
0063 
0064 void KisAsyncAnimationCacheRenderer::frameCancelledCallback(int frame, CancelReason cancelReason)
0065 {
0066     notifyFrameCancelled(frame, cancelReason);
0067 }
0068 
0069 void KisAsyncAnimationCacheRenderer::clearFrameRegenerationState(bool isCancelled)
0070 {
0071     m_d->requestInfo.clear();
0072     m_d->requestedCache = nullptr; // TODO: implement clear() for weak pointers
0073 
0074     KisAsyncAnimationRendererBase::clearFrameRegenerationState(isCancelled);
0075 }
0076 
0077