From d72a3c41890cf7ee12ffa094313d6f0cd42ac4c3 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 30 Dec 2015 01:33:56 +0800 Subject: [PATCH] optimized gifs scroll in saved gifs section --- MSVC.md | 2 +- Telegram/SourceFiles/dropdown.cpp | 31 ++++++++++++++++++++--------- Telegram/SourceFiles/dropdown.h | 3 +++ Telegram/SourceFiles/gui/images.cpp | 1 + Telegram/SourceFiles/layout.cpp | 2 +- 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/MSVC.md b/MSVC.md index 1e1eefa8b..bab565671 100644 --- a/MSVC.md +++ b/MSVC.md @@ -141,7 +141,7 @@ Open **VS2015 x86 Native Tools Command Prompt.bat** (should be in **Start Menu > PKG_CONFIG_PATH="/mingw64/lib/pkgconfig:$PKG_CONFIG_PATH" - ./configure --toolchain=msvc --disable-programs --disable-doc --disable-everything --disable-mmx --enable-libopus --enable-decoder=aac --enable-decoder=aac_latm --enable-decoder=aasc --enable-decoder=flac --enable-decoder=gif --enable-decoder=h264 --enable-decoder=mp1 --enable-decoder=mp1float --enable-decoder=mp2 --enable-decoder=mp2float --enable-decoder=mp3 --enable-decoder=mp3adu --enable-decoder=mp3adufloat --enable-decoder=mp3float --enable-decoder=mp3on4 --enable-decoder=mp3on4float --enable-decoder=mpeg4 --enable-decoder=msmpeg4v2 --enable-decoder=msmpeg4v3 --enable-decoder=wavpack --enable-decoder=opus --enable-decoder=vorbis --enable-decoder=wmalossless --enable-decoder=wmapro --enable-decoder=wmav1 --enable-decoder=wmav2 --enable-decoder=wmavoice --enable-encoder=libopus --enable-hwaccel=h264_d3d11va --enable-hwaccel=h264_dxva2 --enable-parser=aac --enable-parser=aac_latm --enable-parser=flac --enable-parser=h264 --enable-parser=mpeg4video --enable-parser=mpegaudio --enable-parser=opus --enable-parser=vorbis --enable-demuxer=aac --enable-demuxer=flac --enable-demuxer=gif --enable-demuxer=h264 --enable-demuxer=mov --enable-demuxer=mp3 --enable-demuxer=ogg --enable-demuxer=wav --enable-muxer=ogg --enable-muxer=opus --extra-ldflags="-libpath:/d/TBuild/Libraries/opus/win32/VS2010/Win32/Release celt.lib silk_common.lib silk_float.lib" + ./configure --toolchain=msvc --disable-programs --disable-doc --disable-everything --disable-w32threads --disable-mmx --enable-libopus --enable-decoder=aac --enable-decoder=aac_latm --enable-decoder=aasc --enable-decoder=flac --enable-decoder=gif --enable-decoder=h264 --enable-decoder=mp1 --enable-decoder=mp1float --enable-decoder=mp2 --enable-decoder=mp2float --enable-decoder=mp3 --enable-decoder=mp3adu --enable-decoder=mp3adufloat --enable-decoder=mp3float --enable-decoder=mp3on4 --enable-decoder=mp3on4float --enable-decoder=mpeg4 --enable-decoder=msmpeg4v2 --enable-decoder=msmpeg4v3 --enable-decoder=wavpack --enable-decoder=opus --enable-decoder=vorbis --enable-decoder=wmalossless --enable-decoder=wmapro --enable-decoder=wmav1 --enable-decoder=wmav2 --enable-decoder=wmavoice --enable-encoder=libopus --enable-hwaccel=h264_d3d11va --enable-hwaccel=h264_dxva2 --enable-parser=aac --enable-parser=aac_latm --enable-parser=flac --enable-parser=h264 --enable-parser=mpeg4video --enable-parser=mpegaudio --enable-parser=opus --enable-parser=vorbis --enable-demuxer=aac --enable-demuxer=flac --enable-demuxer=gif --enable-demuxer=h264 --enable-demuxer=mov --enable-demuxer=mp3 --enable-demuxer=ogg --enable-demuxer=wav --enable-muxer=ogg --enable-muxer=opus --extra-ldflags="-libpath:/d/TBuild/Libraries/opus/win32/VS2010/Win32/Release celt.lib silk_common.lib silk_float.lib" make make install diff --git a/Telegram/SourceFiles/dropdown.cpp b/Telegram/SourceFiles/dropdown.cpp index 7847397e3..35c902e18 100644 --- a/Telegram/SourceFiles/dropdown.cpp +++ b/Telegram/SourceFiles/dropdown.cpp @@ -1214,6 +1214,7 @@ StickerPanInner::StickerPanInner() : TWidget() , _a_selected(animation(this, &StickerPanInner::step_selected)) , _top(0) , _showingGifs(cShowingSavedGifs()) +, _lastScrolled(0) , _selected(-1) , _pressedSel(-1) , _settings(this, lang(lng_stickers_you_have)) @@ -1229,6 +1230,9 @@ StickerPanInner::StickerPanInner() : TWidget() _previewTimer.setSingleShot(true); connect(&_previewTimer, SIGNAL(timeout()), this, SLOT(onPreview())); + + _updateGifs.setSingleShot(true); + connect(&_updateGifs, SIGNAL(timeout()), this, SLOT(onUpdateGifs())); } void StickerPanInner::setMaxHeight(int32 h) { @@ -1240,6 +1244,7 @@ void StickerPanInner::setMaxHeight(int32 h) { void StickerPanInner::setScrollTop(int top) { if (top == _top) return; + _lastScrolled = getms(); _top = top; updateSelected(); } @@ -1734,15 +1739,12 @@ uint64 StickerPanInner::currentSet(int yOffset) const { void StickerPanInner::ui_repaintSavedGif(const LayoutSavedGif *layout) { if (!_showingGifs) return; - int32 position = layout->position(); - int32 row = position / MatrixRowShift, col = position % MatrixRowShift; - t_assert((row < _gifRows.size()) && (col < _gifRows.at(row).size())); - - const GifRow &gifRow(_gifRows.at(row)); - int32 left = st::savedGifsLeft, top = st::emojiPanHeader + row * (st::savedGifHeight + st::savedGifsSkip); - for (int32 i = 0; i < col; ++i) left += gifRow.at(i)->width() + st::savedGifsSkip; - - rtlupdate(left, top, gifRow.at(col)->width(), st::savedGifHeight); + uint64 ms = getms(); + if (_lastScrolled + 100 <= ms) { + update(); + } else { + _updateGifs.start(_lastScrolled + 100 - ms); + } } bool StickerPanInner::ui_isSavedGifVisible(const LayoutSavedGif *layout) { @@ -2062,6 +2064,17 @@ void StickerPanInner::onPreview() { } } +void StickerPanInner::onUpdateGifs() { + if (!_showingGifs) return; + + uint64 ms = getms(); + if (_lastScrolled + 100 <= ms) { + update(); + } else { + _updateGifs.start(_lastScrolled + 100 - ms); + } +} + void StickerPanInner::step_selected(uint64 ms, bool timer) { QRegion toUpdate; for (Animations::iterator i = _animations.begin(); i != _animations.end();) { diff --git a/Telegram/SourceFiles/dropdown.h b/Telegram/SourceFiles/dropdown.h index e8f73e001..7fd57cc02 100644 --- a/Telegram/SourceFiles/dropdown.h +++ b/Telegram/SourceFiles/dropdown.h @@ -366,6 +366,7 @@ public slots: void updateSelected(); void onSettings(); void onPreview(); + void onUpdateGifs(); signals: @@ -415,6 +416,8 @@ private: QList _custom; bool _showingGifs; + uint64 _lastScrolled; + QTimer _updateGifs; typedef QList GifRow; typedef QList GifRows; diff --git a/Telegram/SourceFiles/gui/images.cpp b/Telegram/SourceFiles/gui/images.cpp index 043c96f63..05f01775a 100644 --- a/Telegram/SourceFiles/gui/images.cpp +++ b/Telegram/SourceFiles/gui/images.cpp @@ -449,6 +449,7 @@ QPixmap imagePix(QImage img, int32 w, int32 h, bool smooth, bool blurred, bool r } } if (rounded) imageRound(img); + img.setDevicePixelRatio(cRetinaFactor()); return QPixmap::fromImage(img, Qt::ColorOnly); } diff --git a/Telegram/SourceFiles/layout.cpp b/Telegram/SourceFiles/layout.cpp index 8713cfab2..59e1a1ced 100644 --- a/Telegram/SourceFiles/layout.cpp +++ b/Telegram/SourceFiles/layout.cpp @@ -1368,7 +1368,7 @@ void LayoutSavedGif::paint(Painter &p, bool paused, uint64 ms) const { if (!_data->thumb->isNull()) { if (_data->thumb->loaded()) { if (_thumb.width() != _width * cIntRetinaFactor() || _thumb.height() != height * cIntRetinaFactor()) { - const_cast(this)->_thumb = _data->thumb->pixNoCache(frame.width(), frame.height(), true, false, false, _width, height); + const_cast(this)->_thumb = _data->thumb->pixNoCache(frame.width() * cIntRetinaFactor(), frame.height() * cIntRetinaFactor(), true, false, false, _width, height); } } else { _data->thumb->load();