Support Webm sticker display in chat history.

This commit is contained in:
John Preston 2022-01-20 15:58:32 +03:00
parent 2f01efdd64
commit 63d15e4479
9 changed files with 138 additions and 149 deletions

View file

@ -302,7 +302,7 @@ bool ShouldAutoPlay(
const Full &data, const Full &data,
not_null<PeerData*> peer, not_null<PeerData*> peer,
not_null<DocumentData*> document) { not_null<DocumentData*> document) {
return data.shouldDownload( return document->sticker() || data.shouldDownload(
SourceFromPeer(peer), SourceFromPeer(peer),
AutoPlayTypeFromDocument(document), AutoPlayTypeFromDocument(document),
document->size); document->size);

View file

@ -1187,6 +1187,9 @@ bool DocumentData::hasRemoteLocation() const {
} }
bool DocumentData::useStreamingLoader() const { bool DocumentData::useStreamingLoader() const {
if (const auto info = sticker()) {
return info->isWebm();
}
return isAnimation() return isAnimation()
|| isVideoFile() || isVideoFile()
|| isAudioFile() || isAudioFile()

View file

@ -947,14 +947,16 @@ std::unique_ptr<HistoryView::Media> MediaFile::createView(
not_null<HistoryView::Element*> message, not_null<HistoryView::Element*> message,
not_null<HistoryItem*> realParent, not_null<HistoryItem*> realParent,
HistoryView::Element *replacing) { HistoryView::Element *replacing) {
if (_document->sticker()) { if (const auto info = _document->sticker(); info && !info->isWebm()) {
return std::make_unique<HistoryView::UnwrappedMedia>( return std::make_unique<HistoryView::UnwrappedMedia>(
message, message,
std::make_unique<HistoryView::Sticker>( std::make_unique<HistoryView::Sticker>(
message, message,
_document, _document,
replacing)); replacing));
} else if (_document->isAnimation() || _document->isVideoFile()) { } else if (_document->isAnimation()
|| _document->isVideoFile()
|| (info && info->isWebm())) {
return std::make_unique<HistoryView::Gif>( return std::make_unique<HistoryView::Gif>(
message, message,
realParent, realParent,

View file

@ -2010,7 +2010,6 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
if (document->isGifv()) { if (document->isGifv()) {
const auto notAutoplayedGif = [&] { const auto notAutoplayedGif = [&] {
return item return item
&& document->isGifv()
&& !Data::AutoDownload::ShouldAutoPlay( && !Data::AutoDownload::ShouldAutoPlay(
session->settings().autoDownload(), session->settings().autoDownload(),
item->history()->peer, item->history()->peer,

View file

@ -244,20 +244,17 @@ void AddDocumentActions(
} }
const auto contextId = item ? item->fullId() : FullMsgId(); const auto contextId = item ? item->fullId() : FullMsgId();
const auto session = &document->session(); const auto session = &document->session();
if (item) { if (item && document->isGifv()) {
const auto notAutoplayedGif = [&] { const auto notAutoplayedGif = !Data::AutoDownload::ShouldAutoPlay(
return document->isGifv() document->session().settings().autoDownload(),
&& !Data::AutoDownload::ShouldAutoPlay( item->history()->peer,
document->session().settings().autoDownload(), document);
item->history()->peer,
document);
}();
if (notAutoplayedGif) { if (notAutoplayedGif) {
menu->addAction(tr::lng_context_open_gif(tr::now), [=] { menu->addAction(tr::lng_context_open_gif(tr::now), [=] {
OpenGif(list->controller(), contextId); OpenGif(list->controller(), contextId);
}, &st::menuIconShowInChat); }, &st::menuIconShowInChat);
} }
if (document->isGifv() && !list->hasCopyRestriction(item)) { if (!list->hasCopyRestriction(item)) {
menu->addAction(tr::lng_context_save_gif(tr::now), [=] { menu->addAction(tr::lng_context_save_gif(tr::now), [=] {
SaveGif(list->controller(), contextId); SaveGif(list->controller(), contextId);
}, &st::menuIconGif); }, &st::menuIconGif);

View file

@ -24,6 +24,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "history/view/history_view_element.h" #include "history/view/history_view_element.h"
#include "history/view/history_view_cursor_state.h" #include "history/view/history_view_cursor_state.h"
#include "history/view/media/history_view_media_common.h" #include "history/view/media/history_view_media_common.h"
#include "history/view/media/history_view_sticker.h"
#include "window/window_session_controller.h" #include "window/window_session_controller.h"
#include "core/application.h" // Application::showDocument. #include "core/application.h" // Application::showDocument.
#include "ui/chat/chat_style.h" #include "ui/chat/chat_style.h"
@ -124,6 +125,22 @@ QSize Gif::sizeForAspectRatio() const {
return { 1, 1 }; return { 1, 1 };
} }
QSize Gif::countThumbSize(int &inOutWidthMax) const {
const auto maxSize = _data->sticker()
? Sticker::Size().width()
: _data->isVideoFile()
? st::maxMediaSize
: _data->isVideoMessage()
? st::maxVideoMessageSize
: st::maxGifSize;
const auto useMaxSize = std::max(maxSize, st::minPhotoSize);
const auto size = _data->sticker()
? videoSize()
: style::ConvertScale(videoSize());
accumulate_min(inOutWidthMax, useMaxSize);
return DownscaledSize(size, { inOutWidthMax, useMaxSize });
}
QSize Gif::countOptimalSize() { QSize Gif::countOptimalSize() {
if (_parent->media() != this) { if (_parent->media() != this) {
_caption = Ui::Text::String(); _caption = Ui::Text::String();
@ -133,32 +150,15 @@ QSize Gif::countOptimalSize() {
_parent->skipBlockHeight()); _parent->skipBlockHeight());
} }
const auto maxSize = _data->isVideoFile() auto thumbMaxWidth = st::msgMaxWidth;
? st::maxMediaSize const auto scaled = countThumbSize(thumbMaxWidth);
: _data->isVideoMessage() _thumbw = scaled.width();
? st::maxVideoMessageSize _thumbh = scaled.height();
: st::maxGifSize;
const auto size = style::ConvertScale(videoSize());
auto tw = size.width();
auto th = size.height();
if (tw > maxSize) {
th = (maxSize * th) / tw;
tw = maxSize;
}
if (th > maxSize) {
tw = (maxSize * tw) / th;
th = maxSize;
}
if (!tw || !th) {
tw = th = 1;
}
_thumbw = tw;
_thumbh = th;
auto maxWidth = std::clamp( auto maxWidth = std::clamp(
std::max(tw, _parent->infoWidth() + 2 * (st::msgDateImgDelta + st::msgDateImgPadding.x())), std::max(_thumbw, _parent->infoWidth() + 2 * (st::msgDateImgDelta + st::msgDateImgPadding.x())),
st::minPhotoSize, st::minPhotoSize,
maxSize); thumbMaxWidth);
auto minHeight = qMax(th, st::minPhotoSize); auto minHeight = qMax(_thumbh, st::minPhotoSize);
if (!activeCurrentStreamed()) { if (!activeCurrentStreamed()) {
accumulate_max(maxWidth, gifMaxStatusWidth(_data) + 2 * (st::msgDateImgDelta + st::msgDateImgPadding.x())); accumulate_max(maxWidth, gifMaxStatusWidth(_data) + 2 * (st::msgDateImgDelta + st::msgDateImgPadding.x()));
} }
@ -171,7 +171,7 @@ QSize Gif::countOptimalSize() {
minHeight += st::msgPadding.bottom(); minHeight += st::msgPadding.bottom();
} }
} }
} else if (isSeparateRoundVideo()) { } else if (isUnwrapped()) {
const auto item = _parent->data(); const auto item = _parent->data();
auto via = item->Get<HistoryMessageVia>(); auto via = item->Get<HistoryMessageVia>();
auto reply = _parent->displayedReply(); auto reply = _parent->displayedReply();
@ -188,38 +188,16 @@ QSize Gif::countOptimalSize() {
QSize Gif::countCurrentSize(int newWidth) { QSize Gif::countCurrentSize(int newWidth) {
auto availableWidth = newWidth; auto availableWidth = newWidth;
const auto maxSize = _data->isVideoFile() auto thumbMaxWidth = newWidth;
? st::maxMediaSize const auto scaled = countThumbSize(thumbMaxWidth);
: _data->isVideoMessage() _thumbw = scaled.width();
? st::maxVideoMessageSize _thumbh = scaled.height();
: st::maxGifSize;
const auto size = style::ConvertScale(videoSize());
auto tw = size.width();
auto th = size.height();
if (tw > maxSize) {
th = (maxSize * th) / tw;
tw = maxSize;
}
if (th > maxSize) {
tw = (maxSize * tw) / th;
th = maxSize;
}
if (!tw || !th) {
tw = th = 1;
}
if (newWidth < tw) {
th = qRound((newWidth / float64(tw)) * th);
tw = newWidth;
}
_thumbw = tw;
_thumbh = th;
newWidth = std::clamp( newWidth = std::clamp(
std::max(tw, _parent->infoWidth() + 2 * (st::msgDateImgDelta + st::msgDateImgPadding.x())), std::max(_thumbw, _parent->infoWidth() + 2 * (st::msgDateImgDelta + st::msgDateImgPadding.x())),
st::minPhotoSize, st::minPhotoSize,
std::min(newWidth, maxSize)); thumbMaxWidth);
auto newHeight = qMax(th, st::minPhotoSize); auto newHeight = qMax(_thumbh, st::minPhotoSize);
if (!activeCurrentStreamed()) { if (!activeCurrentStreamed()) {
accumulate_max(newWidth, gifMaxStatusWidth(_data) + 2 * (st::msgDateImgDelta + st::msgDateImgPadding.x())); accumulate_max(newWidth, gifMaxStatusWidth(_data) + 2 * (st::msgDateImgDelta + st::msgDateImgPadding.x()));
} }
@ -232,7 +210,7 @@ QSize Gif::countCurrentSize(int newWidth) {
newHeight += st::msgPadding.bottom(); newHeight += st::msgPadding.bottom();
} }
} }
} else if (isSeparateRoundVideo()) { } else if (isUnwrapped()) {
accumulate_max(newWidth, _parent->reactionsOptimalWidth()); accumulate_max(newWidth, _parent->reactionsOptimalWidth());
const auto item = _parent->data(); const auto item = _parent->data();
@ -314,13 +292,12 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
const auto activeOwnPlaying = activeOwnStreamed(); const auto activeOwnPlaying = activeOwnStreamed();
auto paintx = 0, painty = 0, paintw = width(), painth = height(); auto paintx = 0, painty = 0, paintw = width(), painth = height();
bool bubble = _parent->hasBubble();
const auto outbg = context.outbg;
auto inWebPage = (_parent->media() != this);
auto captionw = paintw - st::msgPadding.left() - st::msgPadding.right(); auto captionw = paintw - st::msgPadding.left() - st::msgPadding.right();
const bool bubble = _parent->hasBubble();
const auto outbg = context.outbg;
const auto inWebPage = (_parent->media() != this);
const auto isRound = _data->isVideoMessage(); const auto isRound = _data->isVideoMessage();
const auto unwrapped = isUnwrapped();
auto displayMute = false; auto displayMute = false;
const auto streamed = activeRoundPlaying const auto streamed = activeRoundPlaying
? activeRoundPlaying ? activeRoundPlaying
@ -354,16 +331,15 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
painth -= st::msgPadding.bottom(); painth -= st::msgPadding.bottom();
} }
} }
} else if (!isRound) { } else if (!unwrapped) {
Ui::FillRoundShadow(p, 0, 0, paintw, height(), sti->msgShadow, sti->msgShadowCorners); Ui::FillRoundShadow(p, 0, 0, paintw, height(), sti->msgShadow, sti->msgShadowCorners);
} }
auto usex = 0, usew = paintw; auto usex = 0, usew = paintw;
auto separateRoundVideo = isSeparateRoundVideo(); const auto via = unwrapped ? item->Get<HistoryMessageVia>() : nullptr;
auto via = separateRoundVideo ? item->Get<HistoryMessageVia>() : nullptr; const auto reply = unwrapped ? _parent->displayedReply() : nullptr;
auto reply = separateRoundVideo ? _parent->displayedReply() : nullptr; const auto forwarded = unwrapped ? item->Get<HistoryMessageForwarded>() : nullptr;
auto forwarded = separateRoundVideo ? item->Get<HistoryMessageForwarded>() : nullptr; const auto rightAligned = unwrapped
const auto rightAligned = separateRoundVideo
&& outbg && outbg
&& !_parent->delegate()->elementIsChatWide(); && !_parent->delegate()->elementIsChatWide();
if (via || reply || forwarded) { if (via || reply || forwarded) {
@ -376,9 +352,25 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
QRect rthumb(style::rtlrect(usex + paintx, painty, usew, painth, width())); QRect rthumb(style::rtlrect(usex + paintx, painty, usew, painth, width()));
auto roundRadius = isRound ? ImageRoundRadius::Ellipse : inWebPage ? ImageRoundRadius::Small : ImageRoundRadius::Large; const auto roundRadius = isRound
auto roundCorners = (isRound || inWebPage) ? RectPart::AllCorners : ((isBubbleTop() ? (RectPart::TopLeft | RectPart::TopRight) : RectPart::None) ? ImageRoundRadius::Ellipse
| ((isRoundedInBubbleBottom() && _caption.isEmpty()) ? (RectPart::BottomLeft | RectPart::BottomRight) : RectPart::None)); : unwrapped
? ImageRoundRadius::None
: inWebPage
? ImageRoundRadius::Small
: ImageRoundRadius::Large;
const auto roundCorners = isRound
? RectPart::AllCorners
: unwrapped
? RectPart::None
: inWebPage
? RectPart::AllCorners
: ((isBubbleTop()
? (RectPart::TopLeft | RectPart::TopRight)
: RectPart::None)
| ((isRoundedInBubbleBottom() && _caption.isEmpty())
? (RectPart::BottomLeft | RectPart::BottomRight)
: RectPart::None));
if (streamed) { if (streamed) {
auto paused = autoPaused; auto paused = autoPaused;
if (isRound) { if (isRound) {
@ -391,7 +383,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
auto request = ::Media::Streaming::FrameRequest(); auto request = ::Media::Streaming::FrameRequest();
request.outer = QSize(usew, painth) * cIntRetinaFactor(); request.outer = QSize(usew, painth) * cIntRetinaFactor();
request.resize = QSize(_thumbw, _thumbh) * cIntRetinaFactor(); request.resize = QSize(_thumbw, _thumbh) * cIntRetinaFactor();
request.keepAlpha = true; AssertIsDebug(); request.keepAlpha = !isRound && unwrapped;
request.corners = roundCorners; request.corners = roundCorners;
request.radius = roundRadius; request.radius = roundRadius;
if (!activeRoundPlaying && activeOwnPlaying->instance.playerLocked()) { if (!activeRoundPlaying && activeOwnPlaying->instance.playerLocked()) {
@ -462,7 +454,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
p.drawPixmap(rthumb.topLeft(), _videoThumbnailFrame->pixSingle(size, args)); p.drawPixmap(rthumb.topLeft(), _videoThumbnailFrame->pixSingle(size, args));
} else if (const auto blurred = _dataMedia->thumbnailInline()) { } else if (const auto blurred = _dataMedia->thumbnailInline()) {
p.drawPixmap(rthumb.topLeft(), blurred->pixSingle(size, args.blurred())); p.drawPixmap(rthumb.topLeft(), blurred->pixSingle(size, args.blurred()));
} else if (!isRound) { } else if (!unwrapped) {
const auto roundTop = (roundCorners & RectPart::TopLeft); const auto roundTop = (roundCorners & RectPart::TopLeft);
const auto roundBottom = (roundCorners & RectPart::BottomLeft); const auto roundBottom = (roundCorners & RectPart::BottomLeft);
const auto margin = inWebPage const auto margin = inWebPage
@ -479,7 +471,11 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
} }
if (context.selected()) { if (context.selected()) {
Ui::FillComplexOverlayRect(p, st, rthumb, roundRadius, roundCorners); if (unwrapped && !isRound) {
// #TODO stickers
} else {
Ui::FillComplexOverlayRect(p, st, rthumb, roundRadius, roundCorners);
}
} }
if (radial if (radial
@ -559,30 +555,32 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
sti->historyVideoMessageMute.paintInCenter(p, muteRect); sti->historyVideoMessageMute.paintInCenter(p, muteRect);
} }
if (!isRound) { if (!unwrapped) {
drawCornerStatus(p, context, QPoint()); drawCornerStatus(p, context, QPoint());
} }
if (!inWebPage && isRound) { if (unwrapped) {
auto mediaUnread = item->hasUnreadMediaFlag(); if (isRound) {
auto statusW = st::normalFont->width(_statusText) + 2 * st::msgDateImgPadding.x(); const auto mediaUnread = item->hasUnreadMediaFlag();
auto statusH = st::normalFont->height + 2 * st::msgDateImgPadding.y(); auto statusW = st::normalFont->width(_statusText) + 2 * st::msgDateImgPadding.x();
auto statusX = usex + paintx + st::msgDateImgDelta + st::msgDateImgPadding.x(); auto statusH = st::normalFont->height + 2 * st::msgDateImgPadding.y();
auto statusY = painty + painth - st::msgDateImgDelta - statusH + st::msgDateImgPadding.y(); auto statusX = usex + paintx + st::msgDateImgDelta + st::msgDateImgPadding.x();
if (mediaUnread) { auto statusY = painty + painth - st::msgDateImgDelta - statusH + st::msgDateImgPadding.y();
statusW += st::mediaUnreadSkip + st::mediaUnreadSize; if (mediaUnread) {
} statusW += st::mediaUnreadSkip + st::mediaUnreadSize;
Ui::FillRoundRect(p, style::rtlrect(statusX - st::msgDateImgPadding.x(), statusY - st::msgDateImgPadding.y(), statusW, statusH, width()), sti->msgServiceBg, sti->msgServiceBgCorners); }
p.setFont(st::normalFont); Ui::FillRoundRect(p, style::rtlrect(statusX - st::msgDateImgPadding.x(), statusY - st::msgDateImgPadding.y(), statusW, statusH, width()), sti->msgServiceBg, sti->msgServiceBgCorners);
p.setPen(st->msgServiceFg()); p.setFont(st::normalFont);
p.drawTextLeft(statusX, statusY, width(), _statusText, statusW - 2 * st::msgDateImgPadding.x()); p.setPen(st->msgServiceFg());
if (mediaUnread) { p.drawTextLeft(statusX, statusY, width(), _statusText, statusW - 2 * st::msgDateImgPadding.x());
p.setPen(Qt::NoPen); if (mediaUnread) {
p.setBrush(st->msgServiceFg()); p.setPen(Qt::NoPen);
p.setBrush(st->msgServiceFg());
{ {
PainterHighQualityEnabler hq(p); PainterHighQualityEnabler hq(p);
p.drawEllipse(style::rtlrect(statusX - st::msgDateImgPadding.x() + statusW - st::msgDateImgPadding.x() - st::mediaUnreadSize, statusY + st::mediaUnreadTop, st::mediaUnreadSize, st::mediaUnreadSize, width())); p.drawEllipse(style::rtlrect(statusX - st::msgDateImgPadding.x() + statusW - st::msgDateImgPadding.x() - st::mediaUnreadSize, statusY + st::mediaUnreadTop, st::mediaUnreadSize, st::mediaUnreadSize, width()));
}
} }
} }
if (via || reply || forwarded) { if (via || reply || forwarded) {
@ -613,7 +611,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
forwarded->text.drawElided(p, rectx, recty + st::msgReplyPadding.top(), rectw, kMaxGifForwardedBarLines, style::al_left, 0, -1, 0, breakEverywhere); forwarded->text.drawElided(p, rectx, recty + st::msgReplyPadding.top(), rectw, kMaxGifForwardedBarLines, style::al_left, 0, -1, 0, breakEverywhere);
p.restoreTextPalette(); p.restoreTextPalette();
} else if (via) { } else if (via) {
p.setFont(st::msgDateFont); p.setFont(st::msgServiceNameFont);
p.drawTextLeft(rectx, recty + st::msgReplyPadding.top(), 2 * rectx + rectw, via->text); p.drawTextLeft(rectx, recty + st::msgReplyPadding.top(), 2 * rectx + rectw, via->text);
int skip = st::msgServiceNameFont->height + (reply ? st::msgReplyPadding.top() : 0); int skip = st::msgServiceNameFont->height + (reply ? st::msgReplyPadding.top() : 0);
recty += skip; recty += skip;
@ -623,7 +621,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
} }
} }
} }
if (!isRound && !_caption.isEmpty()) { if (!unwrapped && !_caption.isEmpty()) {
p.setPen(stm->historyTextFg); p.setPen(stm->historyTextFg);
_caption.draw(p, st::msgPadding.left(), painty + painth + st::mediaCaptionSkip, captionw, style::al_left, 0, -1, context.selection); _caption.draw(p, st::msgPadding.left(), painty + painth + st::mediaCaptionSkip, captionw, style::al_left, 0, -1, context.selection);
} else if (!inWebPage) { } else if (!inWebPage) {
@ -635,7 +633,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
} else { } else {
maxRight -= st::msgMargin.left(); maxRight -= st::msgMargin.left();
} }
if (isRound && !rightAligned) { if (unwrapped && !rightAligned) {
auto infoWidth = _parent->infoWidth(); auto infoWidth = _parent->infoWidth();
// This is just some arbitrary point, // This is just some arbitrary point,
@ -652,7 +650,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
fullRight, fullRight,
fullBottom, fullBottom,
2 * paintx + paintw, 2 * paintx + paintw,
(isRound (unwrapped
? InfoDisplayType::Background ? InfoDisplayType::Background
: InfoDisplayType::Image)); : InfoDisplayType::Image));
} }
@ -769,15 +767,15 @@ TextState Gif::textState(QPoint point, StateRequest request) const {
painth -= st::mediaCaptionSkip; painth -= st::mediaCaptionSkip;
} }
const auto outbg = _parent->hasOutLayout(); const auto outbg = _parent->hasOutLayout();
auto inWebPage = (_parent->media() != this); const auto inWebPage = (_parent->media() != this);
auto isRound = _data->isVideoMessage(); const auto isRound = _data->isVideoMessage();
auto usew = paintw, usex = 0; const auto unwrapped = isUnwrapped();
auto separateRoundVideo = isSeparateRoundVideo();
const auto item = _parent->data(); const auto item = _parent->data();
auto via = separateRoundVideo ? item->Get<HistoryMessageVia>() : nullptr; auto usew = paintw, usex = 0;
auto reply = separateRoundVideo ? _parent->displayedReply() : nullptr; const auto via = unwrapped ? item->Get<HistoryMessageVia>() : nullptr;
auto forwarded = separateRoundVideo ? item->Get<HistoryMessageForwarded>() : nullptr; const auto reply = unwrapped ? _parent->displayedReply() : nullptr;
const auto rightAligned = separateRoundVideo const auto forwarded = unwrapped ? item->Get<HistoryMessageForwarded>() : nullptr;
const auto rightAligned = unwrapped
&& outbg && outbg
&& !_parent->delegate()->elementIsChatWide(); && !_parent->delegate()->elementIsChatWide();
if (via || reply || forwarded) { if (via || reply || forwarded) {
@ -845,7 +843,7 @@ TextState Gif::textState(QPoint point, StateRequest request) const {
} }
} }
} }
if (!isRound) { if (!unwrapped) {
if (const auto state = cornerStatusTextState(point, request, QPoint()); state.link) { if (const auto state = cornerStatusTextState(point, request, QPoint()); state.link) {
return state; return state;
} }
@ -862,7 +860,7 @@ TextState Gif::textState(QPoint point, StateRequest request) const {
? _cancell ? _cancell
: _savel; : _savel;
} }
if (isRound || _caption.isEmpty()) { if (unwrapped || _caption.isEmpty()) {
auto fullRight = usex + paintx + usew; auto fullRight = usex + paintx + usew;
auto fullBottom = painty + painth; auto fullBottom = painty + painth;
auto maxRight = _parent->width() - st::msgMargin.left(); auto maxRight = _parent->width() - st::msgMargin.left();
@ -871,7 +869,7 @@ TextState Gif::textState(QPoint point, StateRequest request) const {
} else { } else {
maxRight -= st::msgMargin.left(); maxRight -= st::msgMargin.left();
} }
if (isRound && !rightAligned) { if (unwrapped && !rightAligned) {
auto infoWidth = _parent->infoWidth(); auto infoWidth = _parent->infoWidth();
// This is just some arbitrary point, // This is just some arbitrary point,
@ -886,7 +884,7 @@ TextState Gif::textState(QPoint point, StateRequest request) const {
fullRight, fullRight,
fullBottom, fullBottom,
point, point,
(isRound (unwrapped
? InfoDisplayType::Background ? InfoDisplayType::Background
: InfoDisplayType::Image)); : InfoDisplayType::Image));
if (bottomInfoResult.link if (bottomInfoResult.link
@ -993,7 +991,6 @@ void Gif::drawGrouped(
{ geometry.width(), geometry.height() }); { geometry.width(), geometry.height() });
request.outer = geometry.size() * cIntRetinaFactor(); request.outer = geometry.size() * cIntRetinaFactor();
request.resize = pixSize * cIntRetinaFactor(); request.resize = pixSize * cIntRetinaFactor();
request.keepAlpha = true; AssertIsDebug();
request.corners = corners; request.corners = corners;
request.radius = roundRadius; request.radius = roundRadius;
if (activeOwnPlaying->instance.playerLocked()) { if (activeOwnPlaying->instance.playerLocked()) {
@ -1169,10 +1166,9 @@ bool Gif::uploading() const {
} }
bool Gif::needsBubble() const { bool Gif::needsBubble() const {
if (_data->isVideoMessage()) { if (_data->sticker() || _data->isVideoMessage()) {
return false; return false;
} } else if (!_caption.isEmpty()) {
if (!_caption.isEmpty()) {
return true; return true;
} }
const auto item = _parent->data(); const auto item = _parent->data();
@ -1186,7 +1182,7 @@ bool Gif::needsBubble() const {
} }
QRect Gif::contentRectForReactions() const { QRect Gif::contentRectForReactions() const {
if (!isSeparateRoundVideo()) { if (!isUnwrapped()) {
return QRect(0, 0, width(), height()); return QRect(0, 0, width(), height());
} }
auto paintx = 0, painty = 0, paintw = width(), painth = height(); auto paintx = 0, painty = 0, paintw = width(), painth = height();
@ -1210,7 +1206,7 @@ QRect Gif::contentRectForReactions() const {
} }
std::optional<int> Gif::reactionButtonCenterOverride() const { std::optional<int> Gif::reactionButtonCenterOverride() const {
if (!isSeparateRoundVideo()) { if (!isUnwrapped()) {
return std::nullopt; return std::nullopt;
} }
const auto right = resolveCustomInfoRightBottom().x() const auto right = resolveCustomInfoRightBottom().x()
@ -1223,8 +1219,8 @@ QPoint Gif::resolveCustomInfoRightBottom() const {
const auto inner = contentRectForReactions(); const auto inner = contentRectForReactions();
auto fullBottom = inner.y() + inner.height(); auto fullBottom = inner.y() + inner.height();
auto fullRight = inner.x() + inner.width(); auto fullRight = inner.x() + inner.width();
const auto isRound = isSeparateRoundVideo(); const auto unwrapped = isUnwrapped();
if (isRound) { if (unwrapped) {
auto maxRight = _parent->width() - st::msgMargin.left(); auto maxRight = _parent->width() - st::msgMargin.left();
if (_parent->hasFromPhoto()) { if (_parent->hasFromPhoto()) {
maxRight -= st::msgMargin.right(); maxRight -= st::msgMargin.right();
@ -1244,10 +1240,10 @@ QPoint Gif::resolveCustomInfoRightBottom() const {
} }
} }
} }
const auto skipx = isRound const auto skipx = unwrapped
? st::msgDateImgPadding.x() ? st::msgDateImgPadding.x()
: (st::msgDateImgDelta + st::msgDateImgPadding.x()); : (st::msgDateImgDelta + st::msgDateImgPadding.x());
const auto skipy = isRound const auto skipy = unwrapped
? st::msgDateImgPadding.y() ? st::msgDateImgPadding.y()
: (st::msgDateImgDelta + st::msgDateImgPadding.y()); : (st::msgDateImgDelta + st::msgDateImgPadding.y());
return QPoint(fullRight - skipx, fullBottom - skipy); return QPoint(fullRight - skipx, fullBottom - skipy);
@ -1261,16 +1257,9 @@ int Gif::additionalWidth() const {
item->Get<HistoryMessageForwarded>()); item->Get<HistoryMessageForwarded>());
} }
QString Gif::mediaTypeString() const { bool Gif::isUnwrapped() const {
return _data->isVideoMessage() return (_data->sticker() || _data->isVideoMessage())
? tr::lng_in_dlg_video_message(tr::now) && (_parent->media() == this);
: qsl("GIF");
}
bool Gif::isSeparateRoundVideo() const {
return _data->isVideoMessage()
&& (_parent->media() == this)
&& !_parent->hasBubble();
} }
void Gif::validateGroupedCache( void Gif::validateGroupedCache(

View file

@ -119,6 +119,7 @@ private:
struct Streamed; struct Streamed;
void validateVideoThumbnail() const; void validateVideoThumbnail() const;
[[nodiscard]] QSize countThumbSize(int &inOutWidthMax) const;
float64 dataProgress() const override; float64 dataProgress() const override;
bool dataFinished() const override; bool dataFinished() const override;
@ -155,8 +156,7 @@ private:
const HistoryMessageReply *reply, const HistoryMessageReply *reply,
const HistoryMessageForwarded *forwarded) const; const HistoryMessageForwarded *forwarded) const;
[[nodiscard]] int additionalWidth() const; [[nodiscard]] int additionalWidth() const;
[[nodiscard]] QString mediaTypeString() const; [[nodiscard]] bool isUnwrapped() const;
[[nodiscard]] bool isSeparateRoundVideo() const;
void validateGroupedCache( void validateGroupedCache(
const QRect &geometry, const QRect &geometry,

View file

@ -44,9 +44,10 @@ int unitedLineHeight();
} }
[[nodiscard]] inline QSize DownscaledSize(QSize size, QSize box) { [[nodiscard]] inline QSize DownscaledSize(QSize size, QSize box) {
return (size.width() > box.width() || size.height() > box.height()) return NonEmptySize(
? size.scaled(box, Qt::KeepAspectRatio) ((size.width() > box.width() || size.height() > box.height())
: size; ? size.scaled(box, Qt::KeepAspectRatio)
: size));
} }
} // namespace HistoryView } // namespace HistoryView

View file

@ -41,9 +41,7 @@ UnwrappedMedia::UnwrappedMedia(
QSize UnwrappedMedia::countOptimalSize() { QSize UnwrappedMedia::countOptimalSize() {
_content->refreshLink(); _content->refreshLink();
_contentSize = NonEmptySize(DownscaledSize( _contentSize = DownscaledSize(_content->size(), Sticker::Size());
_content->size(),
Sticker::Size()));
auto maxWidth = _contentSize.width(); auto maxWidth = _contentSize.width();
const auto minimal = st::largeEmojiSize + 2 * st::largeEmojiOutline; const auto minimal = st::largeEmojiSize + 2 * st::largeEmojiOutline;
auto minHeight = std::max(_contentSize.height(), minimal); auto minHeight = std::max(_contentSize.height(), minimal);