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