From d72a3c41890cf7ee12ffa094313d6f0cd42ac4c3 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Wed, 30 Dec 2015 01:33:56 +0800
Subject: [PATCH 1/3] 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<bool> _custom;
 
 	bool _showingGifs;
+	uint64 _lastScrolled;
+	QTimer _updateGifs;
 
 	typedef QList<LayoutSavedGif*> GifRow;
 	typedef QList<GifRow> 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<LayoutSavedGif*>(this)->_thumb = _data->thumb->pixNoCache(frame.width(), frame.height(), true, false, false, _width, height);
+					const_cast<LayoutSavedGif*>(this)->_thumb = _data->thumb->pixNoCache(frame.width() * cIntRetinaFactor(), frame.height() * cIntRetinaFactor(), true, false, false, _width, height);
 				}
 			} else {
 				_data->thumb->load();

From e46cc80d52f50cf1aea7a3bc2b18f8af081b5c56 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Wed, 30 Dec 2015 01:36:41 +0800
Subject: [PATCH 2/3] langs updated

---
 Telegram/Resources/lang.strings               | 2 ++
 Telegram/SourceFiles/langs/lang_es.strings    | 8 ++++----
 Telegram/SourceFiles/langs/lang_it.strings    | 2 +-
 Telegram/SourceFiles/langs/lang_pt_BR.strings | 4 ++--
 4 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/Telegram/Resources/lang.strings b/Telegram/Resources/lang.strings
index 578a7133e..9515e846b 100644
--- a/Telegram/Resources/lang.strings
+++ b/Telegram/Resources/lang.strings
@@ -598,6 +598,8 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
 "lng_switch_emoji" = "Emoji";
 
 "lng_saved_gifs" = "Saved GIFs";
+"lng_context_results" = "Results from {context_bot}";
+"lng_context_no_results" = "No results";
 
 "lng_box_remove" = "Remove";
 
diff --git a/Telegram/SourceFiles/langs/lang_es.strings b/Telegram/SourceFiles/langs/lang_es.strings
index f5453d70e..733c19613 100644
--- a/Telegram/SourceFiles/langs/lang_es.strings
+++ b/Telegram/SourceFiles/langs/lang_es.strings
@@ -474,9 +474,9 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
 "lng_failed_add_not_mutual_channel" = "Lo sentimos, si una persona deja el canal, \nsólo un contacto mutuo puede volver \na invitarlo (necesitan tener tu \nnúmero y tú el de ellos).";
 
 "lng_sure_delete_contact" = "¿Quieres eliminar a {contact} de tu lista de contactos?";
-"lng_sure_delete_history" = "¿Quieres eliminar todo el historial de mensajes con {contact}?\n\nEsta acción no se puede deshacer.";
+"lng_sure_delete_history" = "¿Quieres borrar todo el historial de mensajes con {contact}?\n\nEsta acción no se puede deshacer.";
 "lng_sure_delete_group_history" = "¿Quieres borrar todo el historial en «{group}»?\n\nEsta acción no se puede deshacer.";
-"lng_sure_delete_and_exit" = "¿Quieres eliminar todo el historial de mensajes y dejar el grupo «{group}»?\n\nEsta acción no se puede deshacer.";
+"lng_sure_delete_and_exit" = "¿Quieres borrar todo el historial de mensajes y dejar el grupo «{group}»?\n\nEsta acción no se puede deshacer.";
 "lng_sure_leave_channel" = "¿Quieres dejar este canal?";
 "lng_sure_delete_channel" = "¿Quieres eliminar este canal? Todos los miembros y mensajes se perderán.";
 "lng_sure_leave_group" = "¿Quieres salir del grupo?\nNo puedes deshacer esta acción.";
@@ -616,7 +616,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
 "lng_broadcast_ph" = "Difunde un mensaje...";
 "lng_record_cancel" = "Suelta fuera de aquí para cancelar";
 "lng_empty_history" = "";
-"lng_willbe_history" = "Por favor, selecciona un chat para comenzar";
+"lng_willbe_history" = "Selecciona un chat para comenzar";
 "lng_message_with_from" = "[c]{from}:[/c] {message}";
 "lng_from_you" = "Tú";
 "lng_bot_description" = "¿Qué puede hacer este bot?";
@@ -717,7 +717,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
 "lng_send_image_too_large" = "No se pudo enviar el archivo, porque es más grande que 1.5 GB :(";
 "lng_send_folder" = "No se pudo enviar «{name}», porque es un directorio :(";
 
-"lng_forward_choose" = "Elegir destinatario...";
+"lng_forward_choose" = "Elige un destinatario...";
 "lng_forward_cant" = "Lo sentimos, no puedes reenviar aquí :(";
 "lng_forward_confirm" = "¿Reenviar a {recipient}?";
 "lng_forward_share_contact" = "¿Compartir contacto con {recipient}?";
diff --git a/Telegram/SourceFiles/langs/lang_it.strings b/Telegram/SourceFiles/langs/lang_it.strings
index 7613ae82f..34143ed80 100644
--- a/Telegram/SourceFiles/langs/lang_it.strings
+++ b/Telegram/SourceFiles/langs/lang_it.strings
@@ -556,7 +556,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
 "lng_media_type_links" = "Link condivisi";
 
 "lng_media_open_with" = "Apri con";
-"lng_media_download" = "Download";
+"lng_media_download" = "Scarica";
 "lng_media_cancel" = "Annulla";
 "lng_media_video" = "Video";
 "lng_media_audio" = "Nota vocale";
diff --git a/Telegram/SourceFiles/langs/lang_pt_BR.strings b/Telegram/SourceFiles/langs/lang_pt_BR.strings
index de6d18440..8802c8089 100644
--- a/Telegram/SourceFiles/langs/lang_pt_BR.strings
+++ b/Telegram/SourceFiles/langs/lang_pt_BR.strings
@@ -342,7 +342,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
 "lng_connection_try_ipv6" = "Tentando conexão via IPv6";
 "lng_connection_host_ph" = "Nome do host";
 "lng_connection_port_ph" = "Porta";
-"lng_connection_user_ph" = "Nome de usuário";
+"lng_connection_user_ph" = "Usuário";
 "lng_connection_password_ph" = "Senha";
 "lng_connection_save" = "Salvar";
 "lng_settings_show_sessions" = "Exibir todas as sessões";
@@ -448,7 +448,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
 "lng_create_group_next" = "Próximo";
 "lng_create_group_create" = "Criar";
 "lng_create_group_title" = "Novo Grupo";
-"lng_create_group_about" = "Grupos são ideais para comunidades menores, \neles podem ter até {count:_not_used|# membro|# membros}";
+"lng_create_group_about" = "Grupos são ideais para comunidades menores,\ncom até {count:_not_used|# membro|# membros}";
 "lng_create_channel_title" = "Novo Canal";
 "lng_create_channel_about" = "Canais são uma ferramenta para transmitir suas mensagens para audiências ilimitadas";
 "lng_create_public_channel_title" = "Canal Público";

From 24c3ede889cd94b1da49c41354003b518b1213e0 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Wed, 30 Dec 2015 12:17:06 +0800
Subject: [PATCH 3/3] langs updated

---
 Telegram/Resources/lang.strings | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/Telegram/Resources/lang.strings b/Telegram/Resources/lang.strings
index 9515e846b..371a89567 100644
--- a/Telegram/Resources/lang.strings
+++ b/Telegram/Resources/lang.strings
@@ -578,7 +578,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
 
 "lng_media_auto_settings" = "Automatic media download settings";
 "lng_media_auto_photo" = "Automatic photo download";
-"lng_media_auto_audio" = "Automatic audio download";
+"lng_media_auto_audio" = "Automatic voice message download";
 "lng_media_auto_gif" = "Automatic GIF download";
 "lng_media_auto_private_chats" = "Private chats";
 "lng_media_auto_groups" = "Groups and channels";
@@ -598,8 +598,8 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
 "lng_switch_emoji" = "Emoji";
 
 "lng_saved_gifs" = "Saved GIFs";
-"lng_context_results" = "Results from {context_bot}";
-"lng_context_no_results" = "No results";
+"lng_inline_bot_results" = "Results from {inline_bot}";
+"lng_inline_bot_no_results" = "No results";
 
 "lng_box_remove" = "Remove";
 
@@ -832,7 +832,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
 
 "lng_new_version_wrap" = "Telegram Desktop was updated to version {version}\n\n{changes}\n\nFull version history is available here:\n{link}";
 "lng_new_version_minor" = "— Bug fixes and other minor improvements";
-"lng_new_version_text" = "— Sticker management: manually rearrange your sticker packs, pack order is now synced across all your devices\n— Click and hold on a sticker to preview it before sending\n— New context menu for chats in chats list\n— Support for all existing emoji";
+"lng_new_version_text" = "GIF revolution: 10x faster sending and downloading, autoplay, save your favorite GIFs to a dedicated tab on the sticker panel.\n\nMore about GIFs:\n{gifs_link}\n\nInline bots: A new way to add bot content to any chat. Type a bot's username and your query in the text field to get instant results and send them to your chat partner. Try typing “@gif dog” in your next chat. Sample bots: @gif, @wiki, @bingpic, @vid.\n\nMore about inline bots:\n{bots_link}\n\nAlso in this release: New cute design for media, automatic download settings for photos, voice messages and GIFs.";
 
 "lng_menu_insert_unicode" = "Insert Unicode control character";