/* This file is part of Telegram Desktop, the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once #include "base/basic_types.h" #include "base/weak_ptr.h" #include "lottie/lottie_common.h" #include #include #include #include #include namespace rlottie { class Animation; } // namespace rlottie namespace Lottie { inline constexpr auto kMaxFrameRate = 120; inline constexpr auto kMaxSize = 3096; inline constexpr auto kMaxFramesCount = 600; class Animation; class Cache; struct Frame { QImage original; crl::time position = kTimeUnknown; crl::time displayed = kTimeUnknown; crl::time display = kTimeUnknown; FrameRequest request; QImage prepared; }; QImage PrepareFrameByRequest( not_null frame, bool useExistingPrepared); class SharedState { public: SharedState( std::unique_ptr animation, const FrameRequest &request); SharedState( const QByteArray &content, std::unique_ptr animation, std::unique_ptr cache, const FrameRequest &request); void start(not_null owner, crl::time now); [[nodiscard]] Information information() const; [[nodiscard]] bool initialized() const; [[nodiscard]] not_null frameForPaint(); [[nodiscard]] crl::time nextFrameDisplayTime() const; crl::time markFrameDisplayed(crl::time now); crl::time markFrameShown(); void renderFrame(QImage &image, const FrameRequest &request, int index); [[nodiscard]] bool renderNextFrame(const FrameRequest &request); ~SharedState(); private: void construct(const FrameRequest &request); void calculateProperties(); bool isValid() const; void init(QImage cover, const FrameRequest &request); void renderNextFrame( not_null frame, const FrameRequest &request); [[nodiscard]] not_null getFrame(int index); [[nodiscard]] not_null getFrame(int index) const; [[nodiscard]] int counter() const; QByteArray _content; std::unique_ptr _animation; static constexpr auto kCounterUninitialized = -1; std::atomic _counter = kCounterUninitialized; static constexpr auto kFramesCount = 4; std::array _frames; base::weak_ptr _owner; crl::time _started = kTimeUnknown; crl::time _duration = kTimeUnknown; int _frameIndex = 0; int _framesCount = 0; int _frameRate = 0; QSize _size; std::atomic _accumulatedDelayMs = 0; std::unique_ptr _cache; }; class FrameRendererObject; class FrameRenderer final { public: static std::shared_ptr Instance(); void append(std::unique_ptr entry); void updateFrameRequest( not_null entry, const FrameRequest &request); void frameShown(not_null entry); void remove(not_null state); private: using Implementation = FrameRendererObject; crl::object_on_queue _wrapped; }; } // namespace Lottie