data_document_media.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #pragma once
  8. #include "base/flags.h"
  9. class Image;
  10. class FileLoader;
  11. namespace Ui {
  12. class FrameGenerator;
  13. } // namespace Ui
  14. namespace Media {
  15. namespace Clip {
  16. enum class Notification;
  17. class ReaderPointer;
  18. } // namespace Clip
  19. } // namespace Media
  20. namespace Data {
  21. class DocumentMedia;
  22. class VideoPreviewState final {
  23. public:
  24. explicit VideoPreviewState(DocumentMedia *media);
  25. void automaticLoad(Data::FileOrigin origin) const;
  26. [[nodiscard]] ::Media::Clip::ReaderPointer makeAnimation(
  27. Fn<void(::Media::Clip::Notification)> callback) const;
  28. [[nodiscard]] bool usingThumbnail() const;
  29. [[nodiscard]] bool loading() const;
  30. [[nodiscard]] bool loaded() const;
  31. private:
  32. DocumentMedia *_media = nullptr;
  33. bool _usingThumbnail = false;
  34. };
  35. class DocumentMedia final {
  36. public:
  37. explicit DocumentMedia(not_null<DocumentData*> owner);
  38. ~DocumentMedia();
  39. [[nodiscard]] not_null<DocumentData*> owner() const;
  40. void goodThumbnailWanted();
  41. [[nodiscard]] Image *goodThumbnail() const;
  42. void setGoodThumbnail(QImage thumbnail);
  43. [[nodiscard]] Image *thumbnailInline() const;
  44. [[nodiscard]] const QPainterPath &thumbnailPath() const;
  45. [[nodiscard]] Image *thumbnail() const;
  46. [[nodiscard]] QSize thumbnailSize() const;
  47. void thumbnailWanted(Data::FileOrigin origin);
  48. void setThumbnail(QImage thumbnail);
  49. [[nodiscard]] QByteArray videoThumbnailContent() const;
  50. [[nodiscard]] QSize videoThumbnailSize() const;
  51. void videoThumbnailWanted(Data::FileOrigin origin);
  52. void setVideoThumbnail(QByteArray content);
  53. void checkStickerLarge();
  54. void checkStickerSmall();
  55. [[nodiscard]] Image *getStickerSmall();
  56. [[nodiscard]] Image *getStickerLarge();
  57. void checkStickerLarge(not_null<FileLoader*> loader);
  58. void setBytes(const QByteArray &bytes);
  59. [[nodiscard]] QByteArray bytes() const;
  60. [[nodiscard]] bool loaded(bool check = false) const;
  61. [[nodiscard]] float64 progress() const;
  62. [[nodiscard]] bool canBePlayed(HistoryItem *item) const;
  63. void automaticLoad(Data::FileOrigin origin, const HistoryItem *item);
  64. void collectLocalData(not_null<DocumentMedia*> local);
  65. // For DocumentData.
  66. static void CheckGoodThumbnail(not_null<DocumentData*> document);
  67. private:
  68. enum class Flag : uchar {
  69. GoodThumbnailWanted = 0x01,
  70. };
  71. inline constexpr bool is_flag_type(Flag) { return true; };
  72. using Flags = base::flags<Flag>;
  73. static void ReadOrGenerateThumbnail(not_null<DocumentData*> document);
  74. static void GenerateGoodThumbnail(
  75. not_null<DocumentData*> document,
  76. QByteArray data);
  77. [[nodiscard]] bool thumbnailEnoughForSticker() const;
  78. // NB! Right now DocumentMedia can outlive Main::Session!
  79. // In DocumentData::collectLocalData a shared_ptr is sent on_main.
  80. // In case this is a problem the ~Gif code should be rewritten.
  81. const not_null<DocumentData*> _owner;
  82. std::unique_ptr<Image> _goodThumbnail;
  83. mutable std::unique_ptr<Image> _inlineThumbnail;
  84. mutable QPainterPath _pathThumbnail;
  85. std::unique_ptr<Image> _thumbnail;
  86. std::unique_ptr<Image> _sticker;
  87. QByteArray _bytes;
  88. QByteArray _videoThumbnailBytes;
  89. Flags _flags;
  90. };
  91. [[nodiscard]] auto DocumentIconFrameGenerator(not_null<DocumentMedia*> media)
  92. -> FnMut<std::unique_ptr<Ui::FrameGenerator>()>;
  93. [[nodiscard]] auto DocumentIconFrameGenerator(
  94. const std::shared_ptr<DocumentMedia> &media)
  95. -> FnMut<std::unique_ptr<Ui::FrameGenerator>()>;
  96. } // namespace Data