Skip to content

Commit 2e9ce17

Browse files
committed
Merge #2975: [GUI] Replace gif animations with webp
4240f24 Doc: Add mention of webp (Fuzzbawls) 0461fda CI: Add Qt Image Formats Package (Fuzzbawls) efbe945 GUI: Replace loading gifs with webp animations (Fuzzbawls) 618ceb0 Build: Add Qt Image Formats detection (Fuzzbawls) ca99b81 Depends: Add Qt Image Formats (Fuzzbawls) Pull request description: The `.gif` format has many restrictions due to it's age, most notably alpha channels. This replaces the 'loading' animations with `.webp` files, that have much better fidelity. Thanks goes to RedByrd for providing the raw frame sequences. ACKs for top commit: 4240f24 Liquid369: ACK 4240f24 Duddino: ACK 4240f24 Tree-SHA512: 00fd30495bf53ee56a0f46fc81f9dc7767df7697a8c118b5580cc7dc7a5931b0ae02730078afe05f8065783c6cd26121150ca8f2adaa30c736f68ec5ded2d3d8
2 parents 22b38fc + 4240f24 commit 2e9ce17

File tree

14 files changed

+51
-12
lines changed

14 files changed

+51
-12
lines changed

.github/workflows/build-and-test.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,14 +152,14 @@ jobs:
152152
- name: Linux
153153
os: ubuntu-22.04
154154
python-version: '3.8'
155-
packages: python3-zmq qttools5-dev qtbase5-dev qttools5-dev-tools libqt5svg5-dev libqt5charts5-dev libevent-dev bsdmainutils libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-test-dev libboost-thread-dev libminiupnpc-dev libzmq3-dev libqrencode-dev libgmp-dev libsodium-dev cargo
155+
packages: python3-zmq qttools5-dev qtbase5-dev qttools5-dev-tools libqt5svg5-dev libqt5charts5-dev qt5-image-formats-plugins libevent-dev bsdmainutils libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-test-dev libboost-thread-dev libminiupnpc-dev libzmq3-dev libqrencode-dev libgmp-dev libsodium-dev cargo
156156
cc: gcc
157157
cxx: g++
158158

159159
- name: Linux-latest
160160
os: ubuntu-24.04
161161
python-version: '3.8'
162-
packages: python3-zmq qttools5-dev qtbase5-dev qttools5-dev-tools libqt5svg5-dev libqt5charts5-dev libevent-dev bsdmainutils libboost-system1.74-dev libboost-filesystem1.74-dev libboost-chrono1.74-dev libboost-test1.74-dev libboost-thread1.74-dev libminiupnpc-dev libzmq3-dev libqrencode-dev libgmp-dev libsodium-dev cargo
162+
packages: python3-zmq qttools5-dev qtbase5-dev qttools5-dev-tools libqt5svg5-dev libqt5charts5-dev qt5-image-formats-plugins libevent-dev bsdmainutils libboost-system1.74-dev libboost-filesystem1.74-dev libboost-chrono1.74-dev libboost-test1.74-dev libboost-thread1.74-dev libminiupnpc-dev libzmq3-dev libqrencode-dev libgmp-dev libsodium-dev cargo
163163
cc: gcc
164164
cxx: g++
165165

@@ -273,7 +273,7 @@ jobs:
273273
id: Linux-x86_64-nodepends
274274
os: ubuntu-22.04
275275
python-version: '3.8'
276-
packages: python3-zmq qtbase5-dev qttools5-dev-tools libqt5svg5-dev libqt5charts5-dev libevent-dev bsdmainutils libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-test-dev libboost-thread-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev libqrencode-dev libgmp-dev libsodium-dev cargo
276+
packages: python3-zmq qtbase5-dev qttools5-dev-tools libqt5svg5-dev libqt5charts5-dev qt5-image-formats-plugins libevent-dev bsdmainutils libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-test-dev libboost-thread-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev libqrencode-dev libgmp-dev libsodium-dev cargo
277277
unit_tests: true
278278
functional_tests: true
279279
goal: install
@@ -283,7 +283,7 @@ jobs:
283283
id: Linux-x86_64-nodepends-latest
284284
os: ubuntu-24.04
285285
python-version: '3.8'
286-
packages: python3-zmq qtbase5-dev qttools5-dev-tools libqt5svg5-dev libqt5charts5-dev libevent-dev bsdmainutils libboost-system1.74-dev libboost-filesystem1.74-dev libboost-chrono1.74-dev libboost-test1.74-dev libboost-thread1.74-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev libqrencode-dev libgmp-dev libsodium-dev cargo
286+
packages: python3-zmq qtbase5-dev qttools5-dev-tools libqt5svg5-dev libqt5charts5-dev qt5-image-formats-plugins libevent-dev bsdmainutils libboost-system1.74-dev libboost-filesystem1.74-dev libboost-chrono1.74-dev libboost-test1.74-dev libboost-thread1.74-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev libqrencode-dev libgmp-dev libsodium-dev cargo
287287
unit_tests: true
288288
functional_tests: true
289289
goal: install

build-aux/m4/bitcoin_qt.m4

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[
124124
_BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QMinimalIntegrationPlugin)],[-lqminimal])
125125
AC_DEFINE([QT_QPA_PLATFORM_MINIMAL], [1], [Define this symbol if the minimal Qt platform exists])
126126
_BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QSvgPlugin)],[-lqsvg])
127+
_BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QWebpPlugin)],[-lqwebp])
127128
_BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QGifPlugin)],[-lqgif])
128129
_BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QSvgIconPlugin)],[-lqsvgicon])
129130
if test "x$TARGET_OS" = xwindows; then
@@ -350,7 +351,7 @@ AC_DEFUN([_BITCOIN_QT_FIND_STATIC_PLUGINS],[
350351
PKG_CHECK_MODULES([QTDEVICEDISCOVERY], [Qt5DeviceDiscoverySupport], [QT_LIBS="-lQt5DeviceDiscoverySupport $QT_LIBS"])
351352
PKG_CHECK_MODULES([QTACCESSIBILITY], [Qt5AccessibilitySupport], [QT_LIBS="-lQt5AccessibilitySupport $QT_LIBS"])
352353
PKG_CHECK_MODULES([QTFB], [Qt5FbSupport], [QT_LIBS="-lQt5FbSupport $QT_LIBS"])
353-
fi
354+
fi
354355
if test "x$TARGET_OS" = xlinux; then
355356
PKG_CHECK_MODULES([QTXCBQPA], [Qt5XcbQpa], [QT_LIBS="$QTXCBQPA_LIBS $QT_LIBS"])
356357
elif test "x$TARGET_OS" = xdarwin; then

depends/packages/qt.mk

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
PACKAGE=qt
22
$(package)_version=5.9.7
3-
$(package)_download_path=https://download.qt.io/archive/qt/5.9/$($(package)_version)/submodules
3+
$(package)_download_path=https://download.qt.io/new_archive/qt/5.9/$($(package)_version)/submodules
44
$(package)_suffix=opensource-src-$($(package)_version).tar.xz
55
$(package)_file_name=qtbase-$($(package)_suffix)
66
$(package)_sha256_hash=36dd9574f006eaa1e5af780e4b33d11fe39d09fd7c12f3b9d83294174bd28f00
@@ -19,12 +19,16 @@ $(package)_qttools_sha256_hash=d62e0f70d99645d6704dbb8976fb2222443061743689943d4
1919
$(package)_qtsvg_file_name=qtsvg-$($(package)_suffix)
2020
$(package)_qtsvg_sha256_hash=628f22b8472e96ed8033d5491286ce2ab5b2c7b9fe0fe468acd78b458dc75564
2121

22+
$(package)_qtimageformats_file_name=qtimageformats-$($(package)_suffix)
23+
$(package)_qtimageformats_sha256_hash=62053e66014c12edb56a05d2406c78c6b96fc66c2b5aa633e984c9fef398c0aa
24+
2225
$(package)_qtcharts_file_name=qtcharts-$($(package)_suffix)
2326
$(package)_qtcharts_sha256_hash=16cd367241b2e0cd3bc8aea6f874598cd18ad83b72eed89f2713b777272572e6
2427

2528
$(package)_extra_sources = $($(package)_qttranslations_file_name)
2629
$(package)_extra_sources += $($(package)_qttools_file_name)
2730
$(package)_extra_sources += $($(package)_qtsvg_file_name)
31+
$(package)_extra_sources += $($(package)_qtimageformats_file_name)
2832
$(package)_extra_sources += $($(package)_qtcharts_file_name)
2933

3034
define $(package)_set_vars
@@ -136,6 +140,7 @@ $(call fetch_file,$(package),$($(package)_download_path),$($(package)_download_f
136140
$(call fetch_file,$(package),$($(package)_download_path),$($(package)_qttranslations_file_name),$($(package)_qttranslations_file_name),$($(package)_qttranslations_sha256_hash)) && \
137141
$(call fetch_file,$(package),$($(package)_download_path),$($(package)_qttools_file_name),$($(package)_qttools_file_name),$($(package)_qttools_sha256_hash)) && \
138142
$(call fetch_file,$(package),$($(package)_download_path),$($(package)_qtsvg_file_name),$($(package)_qtsvg_file_name),$($(package)_qtsvg_sha256_hash)) && \
143+
$(call fetch_file,$(package),$($(package)_download_path),$($(package)_qtimageformats_file_name),$($(package)_qtimageformats_file_name),$($(package)_qtimageformats_sha256_hash)) && \
139144
$(call fetch_file,$(package),$($(package)_download_path),$($(package)_qtcharts_file_name),$($(package)_qtcharts_file_name),$($(package)_qtcharts_sha256_hash))
140145
endef
141146

@@ -145,6 +150,7 @@ define $(package)_extract_cmds
145150
echo "$($(package)_qttranslations_sha256_hash) $($(package)_source_dir)/$($(package)_qttranslations_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \
146151
echo "$($(package)_qttools_sha256_hash) $($(package)_source_dir)/$($(package)_qttools_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \
147152
echo "$($(package)_qtsvg_sha256_hash) $($(package)_source_dir)/$($(package)_qtsvg_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \
153+
echo "$($(package)_qtimageformats_sha256_hash) $($(package)_source_dir)/$($(package)_qtimageformats_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \
148154
echo "$($(package)_qtcharts_sha256_hash) $($(package)_source_dir)/$($(package)_qtcharts_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \
149155
$(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \
150156
mkdir qtbase && \
@@ -155,6 +161,8 @@ define $(package)_extract_cmds
155161
tar --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qttools_file_name) -C qttools && \
156162
mkdir qtsvg && \
157163
tar --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qtsvg_file_name) -C qtsvg && \
164+
mkdir qtimageformats && \
165+
tar --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qtimageformats_file_name) -C qtimageformats && \
158166
mkdir qtcharts && \
159167
tar --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qtcharts_file_name) -C qtcharts
160168
endef
@@ -216,6 +224,10 @@ define $(package)_config_cmds
216224
cd qtsvg/src/plugins && ../../../qtbase/bin/qmake plugins.pro -o Makefile && cd ../../.. && \
217225
cd qtsvg/src/plugins/imageformats && ../../../../qtbase/bin/qmake imageformats.pro -o Makefile && cd ../../../.. && \
218226
cd qtsvg/src/plugins/imageformats/svg && ../../../../../qtbase/bin/qmake svg.pro -o Makefile && cd ../../../../.. && \
227+
cd qtimageformats && ../qtbase/bin/qmake qtimageformats.pro -o Makefile && cd .. && \
228+
cd qtimageformats/src/plugins && ../../../qtbase/bin/qmake plugins.pro -o Makefile && cd ../../.. && \
229+
cd qtimageformats/src/plugins/imageformats && ../../../../qtbase/bin/qmake imageformats.pro -o Makefile && cd ../../../.. && \
230+
cd qtimageformats/src/plugins/imageformats/webp && ../../../../../qtbase/bin/qmake webp.pro -o Makefile && cd ../../../../.. && \
219231
cd qtcharts && ../qtbase/bin/qmake qtcharts.pro -o Makefile
220232
endef
221233

@@ -228,6 +240,8 @@ define $(package)_build_cmds
228240
$(MAKE) -C ../qtsvg/ && \
229241
$(MAKE) -C ../qtsvg/src/svg && \
230242
$(MAKE) -C ../qtsvg/src/plugins/imageformats && \
243+
$(MAKE) -C ../qtimageformats/ && \
244+
$(MAKE) -C ../qtimageformats/src/plugins/imageformats && \
231245
$(MAKE) -C ../qtcharts/
232246
endef
233247

@@ -236,6 +250,7 @@ define $(package)_stage_cmds
236250
$(MAKE) -C qttools/src/linguist/lrelease INSTALL_ROOT=$($(package)_staging_dir) install_target && \
237251
$(MAKE) -C qttools/src/linguist/lupdate INSTALL_ROOT=$($(package)_staging_dir) install_target && \
238252
$(MAKE) -C qtsvg INSTALL_ROOT=$($(package)_staging_dir) install_subtargets && \
253+
$(MAKE) -C qtimageformats INSTALL_ROOT=$($(package)_staging_dir) install_subtargets && \
239254
$(MAKE) -C qtcharts INSTALL_ROOT=$($(package)_staging_dir) install_subtargets && \
240255
$(MAKE) -C qttranslations INSTALL_ROOT=$($(package)_staging_dir) install_subtargets && \
241256
if `test -f qtbase/src/plugins/platforms/xcb/xcb-static/libxcb-static.a`; then \

doc/build-unix.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ To build without GUI pass `--without-gui`.
110110

111111
To build with Qt 5 you need the following:
112112

113-
sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 libqt5svg5-dev libqt5charts5-dev qttools5-dev qttools5-dev-tools libqrencode-dev
113+
sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 libqt5svg5-dev libqt5charts5-dev qttools5-dev qttools5-dev-tools qt5-image-formats-plugins libqrencode-dev
114114

115115
**Note:** Ubuntu versions prior to Bionic (18.04), and Debian version prior to Buster, do not have the `libqt5charts5-dev` package. If you are compiling on one of these older versions, you will need to omit `libqt5charts5-dev` from the above command.
116116

doc/dependencies.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ These are the dependencies currently used by PIVX Core. You can find instruction
1717
| libnatpmp | [20150609](https://miniupnp.tuxfamily.org/files) | | No | | |
1818
| libjpeg | | | | | [Yes](https://github.com/pivx-project/pivx/blob/master/depends/packages/qt.mk#L65) |
1919
| libpng | | | | | [Yes](https://github.com/pivx-project/pivx/blob/master/depends/packages/qt.mk#L64) |
20+
| libwebp | | | | | [Yes](https://github.com/pivx-project/pivx/blob/master/depends/packages/qt.mk#L22) |
2021
| librsvg | | | | | |
2122
| MiniUPnPc | [2.2.2](https://miniupnp.tuxfamily.org/files) | | No | | |
2223
| GMP | [6.1.2](https://gmplib.org/) | | No | | |

src/Makefile.qt.include

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -496,8 +496,8 @@ RES_ICONS = \
496496
qt/res/images/ic-check-box-indeterminate.svg \
497497
qt/res/images/ic-information.svg \
498498
qt/res/images/ic-information-hover.svg \
499-
qt/res/images/ani-loading-dark.gif \
500-
qt/res/images/ani-loading.gif \
499+
qt/res/images/ani-loading-dark.webp \
500+
qt/res/images/ani-loading-light.webp \
501501
qt/res/images/ic-check-vote.svg \
502502
qt/res/images/ic-check-vote-active.svg \
503503
qt/res/images/ic-check-vote-dark.svg \

src/qt/CMakeLists.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,19 @@ else()
3535
MESSAGE(FATAL_ERROR "Could not find any Qt5 installation")
3636
endif()
3737

38+
list(APPEND _WEBP_PATHS
39+
"/usr/local/opt/qt@5/plugins/imageformats"
40+
"/opt/homebrew/opt/qt@5/plugins/imageformats"
41+
"/usr/lib/"
42+
"/usr/local/lib"
43+
)
44+
find_library(WEBP_FOUND NAMES qwebp PATHS ${_WEBP_PATHS} PATH_SUFFIXES "qt5/plugins/imageformats")
45+
if (WEBP_FOUND)
46+
MESSAGE(STATUS "Found Qt5 webp plugin at ${WEBP_FOUND}")
47+
else ()
48+
MESSAGE(FATAL_ERROR "Qt5 webp plugin not found!")
49+
endif ()
50+
3851
if (Qt5DBus_FOUND)
3952
add_compile_options("-DUSE_DBUS")
4053
endif()

src/qt/loadingdialog.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
44

55
#include "loadingdialog.h"
6+
7+
#include "qtutils.h"
8+
69
#include "ui_loadingdialog.h"
710

811
#include <QMovie>
@@ -36,7 +39,12 @@ LoadingDialog::LoadingDialog(QWidget *parent, QString loadingMsg) :
3639

3740
ui->frame->setProperty("cssClass", "container-loading");
3841

39-
QMovie *movie = new QMovie("://ani-loading-dark");
42+
QMovie *movie = {};
43+
if (isLightTheme()) {
44+
movie = new QMovie("://ani-loading-light");
45+
} else {
46+
movie = new QMovie("://ani-loading-dark");
47+
}
4048
ui->labelMovie->setText("");
4149
ui->labelMovie->setMovie(movie);
4250
movie->start();

src/qt/pivx.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin);
6363
Q_IMPORT_PLUGIN(QSvgPlugin);
6464
Q_IMPORT_PLUGIN(QSvgIconPlugin);
6565
Q_IMPORT_PLUGIN(QGifPlugin);
66+
Q_IMPORT_PLUGIN(QWebpPlugin)
6667
#endif
6768

6869
// Declare meta types used for QMetaObject::invokeMethod

src/qt/pivx.qrc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,8 @@
200200
<file alias="ic-check-box-dark-active">res/images/ic-check-box-dark-active.svg</file>
201201
<file alias="ic-check-box-indeterminate">res/images/ic-check-box-indeterminate.svg</file>
202202
<file alias="ic-check-liliac-indeterminate">res/images/ic-check-liliac-indeterminate.svg</file>
203-
<file alias="ani-loading-dark">res/images/ani-loading-dark.gif</file>
204-
<file alias="ani-loading">res/images/ani-loading.gif</file>
203+
<file alias="ani-loading-dark">res/images/ani-loading-dark.webp</file>
204+
<file alias="ani-loading-light">res/images/ani-loading-light.webp</file>
205205
<file alias="ic-pending">res/images/ic-pending.svg</file>
206206
<file alias="ic-transaction-stake-delegated">res/images/ic-transaction-stake-delegated.svg</file>
207207
<file alias="ic-transaction-stake-delegated-inactive">res/images/ic-transaction-stake-delegated-inactive.svg</file>

0 commit comments

Comments
 (0)