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

0001 /*
0002  *  SPDX-FileCopyrightText: 2015 Jouni Pentikäinen <joupent@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef KIS_ANIMATION_FRAME_CACHE_H
0008 #define KIS_ANIMATION_FRAME_CACHE_H
0009 
0010 #include <QImage>
0011 #include <QObject>
0012 
0013 #include "kritaui_export.h"
0014 #include "kis_types.h"
0015 #include "kis_shared.h"
0016 
0017 class KisImage;
0018 class KisImageAnimationInterface;
0019 class KisTimeSpan;
0020 class KisRegion;
0021 
0022 class KisOpenGLImageTextures;
0023 typedef KisSharedPtr<KisOpenGLImageTextures> KisOpenGLImageTexturesSP;
0024 
0025 class KisOpenGLUpdateInfo;
0026 typedef KisSharedPtr<KisOpenGLUpdateInfo> KisOpenGLUpdateInfoSP;
0027 
0028 class KRITAUI_EXPORT KisAnimationFrameCache : public QObject, public KisShared
0029 {
0030     Q_OBJECT
0031 
0032 public:
0033 
0034     static KisAnimationFrameCacheSP getFrameCache(KisOpenGLImageTexturesSP textures);
0035     static const QList<KisAnimationFrameCache*> caches();
0036     static const KisAnimationFrameCacheSP cacheForImage(KisImageWSP image);
0037 
0038     KisAnimationFrameCache(KisOpenGLImageTexturesSP textures);
0039     ~KisAnimationFrameCache() override;
0040 
0041     QImage getFrame(int time);
0042     bool uploadFrame(int time);
0043 
0044     bool shouldUploadNewFrame(int newTime, int oldTime) const;
0045 
0046     enum CacheStatus {
0047         Cached,
0048         Uncached,
0049     };
0050 
0051     CacheStatus frameStatus(int time) const;
0052 
0053     KisImageWSP image();
0054 
0055     KisOpenGLUpdateInfoSP fetchFrameData(int time, KisImageSP image, const KisRegion &requestedRegion) const;
0056     void addConvertedFrameData(KisOpenGLUpdateInfoSP info, int time);
0057 
0058     /**
0059      * Drops all the frames with worse level of detail values than the current
0060      * desired level of detail.
0061      */
0062     void dropLowQualityFrames(const KisTimeSpan &range, const QRect &regionOfInterest, const QRect &minimalRect);
0063 
0064     bool framesHaveValidRoi(const KisTimeSpan &range, const QRect &regionOfInterest);
0065 
0066 Q_SIGNALS:
0067     void changed();
0068 
0069 private:
0070 
0071     struct Private;
0072     QScopedPointer<Private> m_d;
0073 
0074 private Q_SLOTS:
0075     void framesChanged(const KisTimeSpan &range, const QRect &rect);
0076     void slotConfigChanged();
0077 };
0078 
0079 #endif