mirror of https://github.com/procxx/kepka.git
				
				
				
			Generate good thumbnail for animated stickers.
This commit is contained in:
		
							parent
							
								
									7034df49e9
								
							
						
					
					
						commit
						0a63eac4f6
					
				| 
						 | 
					@ -636,7 +636,10 @@ Image *DocumentData::goodThumbnail() const {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void DocumentData::validateGoodThumbnail() {
 | 
					void DocumentData::validateGoodThumbnail() {
 | 
				
			||||||
	if (!isVideoFile() && !isAnimation() && !isWallPaper()) {
 | 
						if (!isVideoFile()
 | 
				
			||||||
 | 
							&& !isAnimation()
 | 
				
			||||||
 | 
							&& !isWallPaper()
 | 
				
			||||||
 | 
							&& (!sticker() || !sticker()->animated)) {
 | 
				
			||||||
		_goodThumbnail = nullptr;
 | 
							_goodThumbnail = nullptr;
 | 
				
			||||||
	} else if (!_goodThumbnail && hasRemoteLocation()) {
 | 
						} else if (!_goodThumbnail && hasRemoteLocation()) {
 | 
				
			||||||
		_goodThumbnail = std::make_unique<Image>(
 | 
							_goodThumbnail = std::make_unique<Image>(
 | 
				
			||||||
| 
						 | 
					@ -665,7 +668,10 @@ void DocumentData::setGoodThumbnailOnUpload(
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	_goodThumbnail = std::make_unique<Image>(
 | 
						_goodThumbnail = std::make_unique<Image>(
 | 
				
			||||||
		std::make_unique<Images::LocalFileSource>(
 | 
							std::make_unique<Images::LocalFileSource>(
 | 
				
			||||||
			QString(), std::move(bytes), "JPG", std::move(image)));
 | 
								QString(),
 | 
				
			||||||
 | 
								std::move(bytes),
 | 
				
			||||||
 | 
								sticker() ? "WEBP" : "JPG",
 | 
				
			||||||
 | 
								std::move(image)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
auto DocumentData::bigFileBaseCacheKey() const
 | 
					auto DocumentData::bigFileBaseCacheKey() const
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | 
				
			||||||
#include "data/data_document.h"
 | 
					#include "data/data_document.h"
 | 
				
			||||||
#include "data/data_file_origin.h"
 | 
					#include "data/data_file_origin.h"
 | 
				
			||||||
#include "media/clip/media_clip_reader.h"
 | 
					#include "media/clip/media_clip_reader.h"
 | 
				
			||||||
 | 
					#include "lottie/lottie_animation.h"
 | 
				
			||||||
#include "auth_session.h"
 | 
					#include "auth_session.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Data {
 | 
					namespace Data {
 | 
				
			||||||
| 
						 | 
					@ -19,12 +20,20 @@ namespace {
 | 
				
			||||||
constexpr auto kGoodThumbQuality = 87;
 | 
					constexpr auto kGoodThumbQuality = 87;
 | 
				
			||||||
constexpr auto kWallPaperSize = 960;
 | 
					constexpr auto kWallPaperSize = 960;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum class FileType {
 | 
				
			||||||
 | 
						Video,
 | 
				
			||||||
 | 
						AnimatedSticker,
 | 
				
			||||||
 | 
						WallPaper,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QImage Prepare(
 | 
					QImage Prepare(
 | 
				
			||||||
		const QString &path,
 | 
							const QString &path,
 | 
				
			||||||
		QByteArray data,
 | 
							QByteArray data,
 | 
				
			||||||
		bool isWallPaper) {
 | 
							FileType type) {
 | 
				
			||||||
	if (!isWallPaper) {
 | 
						if (type == FileType::Video) {
 | 
				
			||||||
		return Media::Clip::PrepareForSending(path, data).thumbnail;
 | 
							return Media::Clip::PrepareForSending(path, data).thumbnail;
 | 
				
			||||||
 | 
						} else if (type == FileType::AnimatedSticker) {
 | 
				
			||||||
 | 
							return Lottie::ReadThumbnail(Lottie::ReadContent(data, path));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	const auto validateSize = [](QSize size) {
 | 
						const auto validateSize = [](QSize size) {
 | 
				
			||||||
		return (size.width() + size.height()) < 10'000;
 | 
							return (size.width() + size.height()) < 10'000;
 | 
				
			||||||
| 
						 | 
					@ -64,7 +73,11 @@ void GoodThumbSource::generate(base::binary_guard &&guard) {
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	const auto data = _document->data();
 | 
						const auto data = _document->data();
 | 
				
			||||||
	const auto isWallPaper = _document->isWallPaper();
 | 
						const auto type = _document->isWallPaper()
 | 
				
			||||||
 | 
							? FileType::WallPaper
 | 
				
			||||||
 | 
							: _document->sticker()
 | 
				
			||||||
 | 
							? FileType::AnimatedSticker
 | 
				
			||||||
 | 
							: FileType::Video;
 | 
				
			||||||
	auto location = _document->location().isEmpty()
 | 
						auto location = _document->location().isEmpty()
 | 
				
			||||||
		? nullptr
 | 
							? nullptr
 | 
				
			||||||
		: std::make_unique<FileLocation>(_document->location());
 | 
							: std::make_unique<FileLocation>(_document->location());
 | 
				
			||||||
| 
						 | 
					@ -80,11 +93,13 @@ void GoodThumbSource::generate(base::binary_guard &&guard) {
 | 
				
			||||||
		const auto filepath = (location && location->accessEnable())
 | 
							const auto filepath = (location && location->accessEnable())
 | 
				
			||||||
			? location->name()
 | 
								? location->name()
 | 
				
			||||||
			: QString();
 | 
								: QString();
 | 
				
			||||||
		auto result = Prepare(filepath, data, isWallPaper);
 | 
							auto result = Prepare(filepath, data, type);
 | 
				
			||||||
		auto bytes = QByteArray();
 | 
							auto bytes = QByteArray();
 | 
				
			||||||
		if (!result.isNull()) {
 | 
							if (!result.isNull()) {
 | 
				
			||||||
			auto buffer = QBuffer(&bytes);
 | 
								auto buffer = QBuffer(&bytes);
 | 
				
			||||||
			const auto format = (isWallPaper && result.hasAlphaChannel())
 | 
								const auto format = (type == FileType::AnimatedSticker)
 | 
				
			||||||
 | 
									? "WEBP"
 | 
				
			||||||
 | 
									: (type == FileType::WallPaper && result.hasAlphaChannel())
 | 
				
			||||||
				? "PNG"
 | 
									? "PNG"
 | 
				
			||||||
				: "JPG";
 | 
									: "JPG";
 | 
				
			||||||
			result.save(&buffer, format, kGoodThumbQuality);
 | 
								result.save(&buffer, format, kGoodThumbQuality);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -156,6 +156,10 @@ void HistorySticker::draw(Painter &p, const QRect &r, TextSelection selection, c
 | 
				
			||||||
		const auto w = _pixw;
 | 
							const auto w = _pixw;
 | 
				
			||||||
		const auto h = _pixh;
 | 
							const auto h = _pixh;
 | 
				
			||||||
		const auto &c = st::msgStickerOverlay;
 | 
							const auto &c = st::msgStickerOverlay;
 | 
				
			||||||
 | 
							const auto good = _data->goodThumbnail();
 | 
				
			||||||
 | 
							if (!lottieReady && good && !good->loaded()) {
 | 
				
			||||||
 | 
								good->load({});
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		static QPixmap empty;
 | 
							static QPixmap empty;
 | 
				
			||||||
		if (lottieReady) {
 | 
							if (lottieReady) {
 | 
				
			||||||
			return empty;
 | 
								return empty;
 | 
				
			||||||
| 
						 | 
					@ -170,6 +174,10 @@ void HistorySticker::draw(Painter &p, const QRect &r, TextSelection selection, c
 | 
				
			||||||
		//	return selected
 | 
							//	return selected
 | 
				
			||||||
		//		? blurred->pixBlurredColored(o, c, w, h)
 | 
							//		? blurred->pixBlurredColored(o, c, w, h)
 | 
				
			||||||
		//		: blurred->pixBlurred(o, w, h);
 | 
							//		: blurred->pixBlurred(o, w, h);
 | 
				
			||||||
 | 
							} else if (good && good->loaded()) {
 | 
				
			||||||
 | 
								return selected
 | 
				
			||||||
 | 
									? good->pixColored(o, c, w, h)
 | 
				
			||||||
 | 
									: good->pix(o, w, h);
 | 
				
			||||||
		} else if (const auto thumbnail = _data->thumbnail()) {
 | 
							} else if (const auto thumbnail = _data->thumbnail()) {
 | 
				
			||||||
			return selected
 | 
								return selected
 | 
				
			||||||
				? thumbnail->pixBlurredColored(o, c, w, h)
 | 
									? thumbnail->pixBlurredColored(o, c, w, h)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -894,6 +894,13 @@ void FileLoadTask::process() {
 | 
				
			||||||
					MTP_string(QString()),
 | 
										MTP_string(QString()),
 | 
				
			||||||
					MTP_inputStickerSetEmpty(),
 | 
										MTP_inputStickerSetEmpty(),
 | 
				
			||||||
					MTPMaskCoords()));
 | 
										MTPMaskCoords()));
 | 
				
			||||||
 | 
									if (isAnimation) {
 | 
				
			||||||
 | 
										goodThumbnail = fullimage;
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											QBuffer buffer(&goodThumbnailBytes);
 | 
				
			||||||
 | 
											goodThumbnail.save(&buffer, "WEBP", kThumbnailQuality);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			} else if (isAnimation) {
 | 
								} else if (isAnimation) {
 | 
				
			||||||
				attributes.push_back(MTP_documentAttributeAnimated());
 | 
									attributes.push_back(MTP_documentAttributeAnimated());
 | 
				
			||||||
			} else if (_type != SendMediaType::File) {
 | 
								} else if (_type != SendMediaType::File) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue