From 3cd9d4b5ec7f5e878a9a886c805596ad3fc91e20 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 28 Mar 2019 12:51:08 +0400 Subject: [PATCH] Fix video messages playback on Retina. --- Telegram/SourceFiles/facades.cpp | 4 -- Telegram/SourceFiles/facades.h | 3 -- .../SourceFiles/ui/image/image_prepare.cpp | 45 ++++++++++--------- 3 files changed, 23 insertions(+), 29 deletions(-) diff --git a/Telegram/SourceFiles/facades.cpp b/Telegram/SourceFiles/facades.cpp index d7079cfe76..b30ed56f8d 100644 --- a/Telegram/SourceFiles/facades.cpp +++ b/Telegram/SourceFiles/facades.cpp @@ -419,8 +419,6 @@ struct Data { crl::time LastFeaturedStickersUpdate = 0; Stickers::Order ArchivedStickerSetsOrder; - CircleMasksMap CircleMasks; - bool AskDownloadPath = false; QString DownloadPath; QByteArray DownloadPathBookmark; @@ -553,8 +551,6 @@ DefineRefVar(Global, base::Observable, FeaturedStickerSetsUnreadCountChang DefineVar(Global, crl::time, LastFeaturedStickersUpdate); DefineVar(Global, Stickers::Order, ArchivedStickerSetsOrder); -DefineRefVar(Global, CircleMasksMap, CircleMasks); - DefineVar(Global, bool, AskDownloadPath); DefineVar(Global, QString, DownloadPath); DefineVar(Global, QByteArray, DownloadPathBookmark); diff --git a/Telegram/SourceFiles/facades.h b/Telegram/SourceFiles/facades.h index 1aa9cdc32c..30475f939a 100644 --- a/Telegram/SourceFiles/facades.h +++ b/Telegram/SourceFiles/facades.h @@ -264,9 +264,6 @@ DeclareRefVar(base::Observable, PhoneCallsEnabledChanged); typedef QMap HiddenPinnedMessagesMap; DeclareVar(HiddenPinnedMessagesMap, HiddenPinnedMessages); -typedef QMap CircleMasksMap; -DeclareRefVar(CircleMasksMap, CircleMasks); - DeclareVar(bool, AskDownloadPath); DeclareVar(QString, DownloadPath); DeclareVar(QByteArray, DownloadPathBookmark); diff --git a/Telegram/SourceFiles/ui/image/image_prepare.cpp b/Telegram/SourceFiles/ui/image/image_prepare.cpp index bf2b9b8224..e3fda222fa 100644 --- a/Telegram/SourceFiles/ui/image/image_prepare.cpp +++ b/Telegram/SourceFiles/ui/image/image_prepare.cpp @@ -14,29 +14,29 @@ TG_FORCE_INLINE uint64 blurGetColors(const uchar *p) { return (uint64)p[0] + ((uint64)p[1] << 16) + ((uint64)p[2] << 32) + ((uint64)p[3] << 48); } -const QPixmap &circleMask(int width, int height) { +const QImage &circleMask(QSize size) { Assert(Global::started()); - uint64 key = uint64(uint32(width)) << 32 | uint64(uint32(height)); + uint64 key = (uint64(uint32(size.width())) << 32) + | uint64(uint32(size.height())); - Global::CircleMasksMap &masks(Global::RefCircleMasks()); - auto i = masks.constFind(key); - if (i == masks.cend()) { - QImage mask(width, height, QImage::Format_ARGB32_Premultiplied); - { - Painter p(&mask); - PainterHighQualityEnabler hq(p); - - p.setCompositionMode(QPainter::CompositionMode_Source); - p.fillRect(0, 0, width, height, Qt::transparent); - p.setBrush(Qt::white); - p.setPen(Qt::NoPen); - p.drawEllipse(0, 0, width, height); - } - mask.setDevicePixelRatio(cRetinaFactor()); - i = masks.insert(key, App::pixmapFromImageInPlace(std::move(mask))); + static auto masks = base::flat_map(); + const auto i = masks.find(key); + if (i != end(masks)) { + return i->second; } - return i.value(); + auto mask = QImage( + size, + QImage::Format_ARGB32_Premultiplied); + mask.fill(Qt::transparent); + { + Painter p(&mask); + PainterHighQualityEnabler hq(p); + p.setBrush(Qt::white); + p.setPen(Qt::NoPen); + p.drawEllipse(QRect(QPoint(), size)); + } + return masks.emplace(key, std::move(mask)).first->second; } } // namespace @@ -387,14 +387,14 @@ QImage BlurLargeImage(QImage image, int radius) { void prepareCircle(QImage &img) { Assert(!img.isNull()); - img.setDevicePixelRatio(cRetinaFactor()); img = img.convertToFormat(QImage::Format_ARGB32_Premultiplied); Assert(!img.isNull()); - QPixmap mask = circleMask(img.width(), img.height()); Painter p(&img); p.setCompositionMode(QPainter::CompositionMode_DestinationIn); - p.drawPixmap(0, 0, mask); + p.drawImage( + QRect(QPoint(), img.size() / img.devicePixelRatio()), + circleMask(img.size())); } void prepareRound( @@ -463,6 +463,7 @@ void prepareRound( Assert((corners & RectPart::AllCorners) == RectPart::AllCorners); Assert(target.isNull()); prepareCircle(image); + return; } Assert(!image.isNull());