Fix sticker image caching in case cell size changes.

This commit is contained in:
John Preston 2022-03-31 14:56:35 +04:00
parent b1e66279d5
commit f6559c01e4
2 changed files with 11 additions and 2 deletions

View file

@ -230,6 +230,7 @@ struct StickersListWidget::Sticker {
Lottie::Animation *lottie = nullptr; Lottie::Animation *lottie = nullptr;
Media::Clip::ReaderPointer webm; Media::Clip::ReaderPointer webm;
QPixmap savedFrame; QPixmap savedFrame;
QSize savedFrameFor;
void ensureMediaCreated(); void ensureMediaCreated();
}; };
@ -1646,6 +1647,7 @@ void StickersListWidget::takeHeavyData(Set &to, Set &from) {
void StickersListWidget::takeHeavyData(Sticker &to, Sticker &from) { void StickersListWidget::takeHeavyData(Sticker &to, Sticker &from) {
to.documentMedia = std::move(from.documentMedia); to.documentMedia = std::move(from.documentMedia);
to.savedFrame = std::move(from.savedFrame); to.savedFrame = std::move(from.savedFrame);
to.savedFrameFor = from.savedFrameFor;
to.lottie = base::take(from.lottie); to.lottie = base::take(from.lottie);
to.webm = base::take(from.webm); to.webm = base::take(from.webm);
} }
@ -1941,6 +1943,7 @@ void StickersListWidget::clearHeavyIn(Set &set, bool clearSavedFrames) {
for (auto &sticker : set.stickers) { for (auto &sticker : set.stickers) {
if (clearSavedFrames) { if (clearSavedFrames) {
sticker.savedFrame = QPixmap(); sticker.savedFrame = QPixmap();
sticker.savedFrameFor = QSize();
} }
sticker.webm = nullptr; sticker.webm = nullptr;
sticker.lottie = nullptr; sticker.lottie = nullptr;
@ -2270,6 +2273,7 @@ void StickersListWidget::paintSticker(
if (sticker.savedFrame.isNull()) { if (sticker.savedFrame.isNull()) {
sticker.savedFrame = QPixmap::fromImage(frame, Qt::ColorOnly); sticker.savedFrame = QPixmap::fromImage(frame, Qt::ColorOnly);
sticker.savedFrame.setDevicePixelRatio(cRetinaFactor()); sticker.savedFrame.setDevicePixelRatio(cRetinaFactor());
sticker.savedFrameFor = _singleSize;
} }
set.lottiePlayer->unpause(sticker.lottie); set.lottiePlayer->unpause(sticker.lottie);
} else if (sticker.webm && sticker.webm->started()) { } else if (sticker.webm && sticker.webm->started()) {
@ -2279,11 +2283,15 @@ void StickersListWidget::paintSticker(
if (sticker.savedFrame.isNull()) { if (sticker.savedFrame.isNull()) {
sticker.savedFrame = frame; sticker.savedFrame = frame;
sticker.savedFrame.setDevicePixelRatio(cRetinaFactor()); sticker.savedFrame.setDevicePixelRatio(cRetinaFactor());
sticker.savedFrameFor = _singleSize;
} }
p.drawPixmapLeft(ppos, width(), frame); p.drawPixmapLeft(ppos, width(), frame);
} else { } else {
const auto image = media->getStickerSmall(); const auto image = media->getStickerSmall();
const auto pixmap = !sticker.savedFrame.isNull() const auto ratio = style::DevicePixelRatio();
const auto useSavedFrame = !sticker.savedFrame.isNull()
&& (sticker.savedFrameFor == _singleSize);
const auto pixmap = useSavedFrame
? sticker.savedFrame ? sticker.savedFrame
: image : image
? image->pixSingle(size, { .outer = size }) ? image->pixSingle(size, { .outer = size })
@ -2292,6 +2300,7 @@ void StickersListWidget::paintSticker(
p.drawPixmapLeft(ppos, width(), pixmap); p.drawPixmapLeft(ppos, width(), pixmap);
if (sticker.savedFrame.isNull()) { if (sticker.savedFrame.isNull()) {
sticker.savedFrame = pixmap; sticker.savedFrame = pixmap;
sticker.savedFrameFor = _singleSize;
} }
} else { } else {
PaintStickerThumbnailPath( PaintStickerThumbnailPath(

View file

@ -285,7 +285,7 @@ QSize ComputeStickerSize(not_null<DocumentData*> document, QSize box) {
} }
const auto ratio = style::DevicePixelRatio(); const auto ratio = style::DevicePixelRatio();
const auto request = Lottie::FrameRequest{ box * ratio }; const auto request = Lottie::FrameRequest{ box * ratio };
return HistoryView::NonEmptySize(request.size(dimensions, true) / ratio); return HistoryView::NonEmptySize(request.size(dimensions, 8) / ratio);
} }
} // namespace ChatHelpers } // namespace ChatHelpers