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