From 52122c588a482adf08e0f9a5f1208fb872505c5e Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Fri, 5 Feb 2016 06:58:18 +0000 Subject: [PATCH] Render some icons when possible 8-bit icon is required to make builds deterministic --- Makefile.am | 7 ++++-- configure.ac | 20 ++++++++++++++++ share/setup.nsi.in | 2 +- src/Makefile.qt.include | 44 ++++++++++++++++++++++++++++++++---- src/qt/bitcoin.qrc | 2 +- src/qt/res/bitcoin-qt-res.rc | 2 +- src/qt/res/src/bitcoin.svg | 2 +- 7 files changed, 69 insertions(+), 10 deletions(-) diff --git a/Makefile.am b/Makefile.am index b2a0201b70..35a5d42cda 100644 --- a/Makefile.am +++ b/Makefile.am @@ -39,7 +39,7 @@ OSX_APP=Bitcoin-Qt.app OSX_VOLNAME = $(subst $(space),-,$(PACKAGE_NAME)) OSX_DMG = $(OSX_VOLNAME).dmg OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus -OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/bitcoin.icns +OSX_INSTALLER_ICONS=src/qt/res/rendered_icons/bitcoin.icns OSX_PLIST=$(top_builddir)/share/qt/Info.plist #not installed DIST_CONTRIB = \ @@ -58,7 +58,7 @@ BIN_CHECKS=$(top_srcdir)/contrib/devtools/symbol-check.py \ $(top_srcdir)/contrib/devtools/security-check.py \ $(top_srcdir)/contrib/devtools/utils.py -WINDOWS_PACKAGING = $(top_srcdir)/src/qt/res/icons/bitcoin.ico \ +WINDOWS_PACKAGING = src/qt/res/rendered_icons/bitcoin.ico \ $(top_srcdir)/share/pixmaps/nsis-header.bmp \ $(top_srcdir)/share/pixmaps/nsis-wizard.bmp \ $(top_srcdir)/doc/README_windows.txt @@ -71,6 +71,9 @@ COVERAGE_INFO = $(COV_TOOL_WRAPPER) baseline.info \ baseline_filtered.info functional_test.info functional_test_filtered.info \ test_bitcoin_coverage.info test_bitcoin.info fuzz.info fuzz_filtered.info fuzz_coverage.info +$(OSX_INSTALLER_ICONS): FORCE + $(MAKE) -C src $(patsubst src/%,%,$@) + dist-hook: -$(GIT) archive --format=tar HEAD -- src/clientversion.cpp | $(AMTAR) -C $(top_distdir) -xf - diff --git a/configure.ac b/configure.ac index c4bf857f1c..aab6d370a2 100644 --- a/configure.ac +++ b/configure.ac @@ -680,6 +680,17 @@ AC_ARG_WITH([daemon], [build_bitcoind=$withval], [build_bitcoind=yes]) +can_render_icons=yes +AC_PATH_PROGS([RSVG_CONVERT],[rsvg-convert rsvg],no) +AC_PATH_PROGS([IMAGEMAGICK_CONVERT],[convert],no) +AC_PATH_PROGS([PNG2ICNS],[png2icns],no) + +if test x$RSVG_CONVERT = xno; then + can_render_icons='rsvg-convert' +elif test x$IMAGEMAGICK_CONVERT = xno; then + can_render_icons='(ImageMagick) convert' +fi + case $host in *mingw*) TARGET_OS=windows @@ -729,6 +740,10 @@ case $host in AX_CHECK_LINK_FLAG([-Wl,--major-subsystem-version -Wl,6 -Wl,--minor-subsystem-version -Wl,1], [CORE_LDFLAGS="$CORE_LDFLAGS -Wl,--major-subsystem-version -Wl,6 -Wl,--minor-subsystem-version -Wl,1"], [], [$LDFLAG_WERROR]) ;; *darwin*) + if test x$PNG2ICNS = xno; then + can_render_icons='png2icns' + fi + TARGET_OS=darwin if test $cross_compiling != "yes"; then BUILD_OS=darwin @@ -833,6 +848,11 @@ case $host in ;; esac +AM_CONDITIONAL([CAN_RENDER_ICONS], [test "$can_render_icons" = "yes"]) +if test "$can_render_icons" != "yes"; then + AC_MSG_WARN([Couldn't find ${can_render_icons}; you won't get the Knots-branded Bitcoin icon]) +fi + if test "$use_extended_functional_tests" != "no"; then AC_SUBST(EXTENDED_FUNCTIONAL_TESTS, --extended) fi diff --git a/share/setup.nsi.in b/share/setup.nsi.in index cdaae1ef9a..58af804d7e 100644 --- a/share/setup.nsi.in +++ b/share/setup.nsi.in @@ -15,7 +15,7 @@ Unicode true !define URL @PACKAGE_URL@ # MUI Symbol Definitions -!define MUI_ICON "@abs_top_srcdir@/src/qt/res/icons/bitcoin.ico" +!define MUI_ICON "@abs_top_srcdir@/src/qt/res/rendered_icons/bitcoin.ico" !define MUI_WELCOMEFINISHPAGE_BITMAP "@abs_top_srcdir@/share/pixmaps/nsis-wizard.bmp" !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_RIGHT diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 5f75217921..fe22975797 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -172,12 +172,20 @@ BITCOIN_QT_H = \ QT_RES_FONTS = \ qt/res/fonts/RobotoMono-Bold.ttf -QT_RES_ICONS = \ +RES_RENDERED_ICON_SRC = qt/res/src/bitcoin.svg + +RES_RENDERED_ICONS = \ + qt/res/rendered_icons/bitcoin.ico \ + qt/res/rendered_icons/bitcoin1024.png + +RES_ALL_RENDERED_ICONS = $(RES_RENDERED_ICONS) \ + $(patsubst %,qt/res/rendered_icons/bitcoin%.png,16 32 48 256 512 1024) \ + qt/res/rendered_icons/bitcoin.icns + +QT_RES_ICONS = $(RES_RENDERED_ICONS) \ qt/res/icons/add.png \ qt/res/icons/address-book.png \ - qt/res/icons/bitcoin.ico \ qt/res/icons/bitcoin_testnet.ico \ - qt/res/icons/bitcoin.png \ qt/res/icons/chevron.png \ qt/res/icons/clock1.png \ qt/res/icons/clock2.png \ @@ -293,6 +301,8 @@ QT_RES_ANIMATION = $(wildcard $(srcdir)/qt/res/animation/spinner-*.png) BITCOIN_QT_RC = qt/res/bitcoin-qt-res.rc +$(BITCOIN_RC): qt/res/rendered_icons/bitcoin.ico + BITCOIN_QT_INCLUDES = -DQT_NO_KEYWORDS -DQT_USE_QSTRINGBUILDER qt_libbitcoinqt_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \ @@ -384,7 +394,7 @@ $(QT_QRC_CPP): $(QT_QRC_BUILD) $(QT_FORMS_H) $(QT_RES_FONTS) $(QT_RES_ICONS) $(Q @test -f $(RCC) $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin --format-version 1 $< > $@ -CLEAN_QT = $(nodist_qt_libbitcoinqt_a_SOURCES) $(QT_QM) $(QT_FORMS_H) qt/*.gcda qt/*.gcno qt/temp_bitcoin_locale.qrc $(QT_QRC_BUILD) +CLEAN_QT = $(nodist_qt_libbitcoinqt_a_SOURCES) $(QT_QM) $(QT_FORMS_H) qt/*.gcda qt/*.gcno qt/temp_bitcoin_locale.qrc $(QT_QRC_BUILD) $(RES_ALL_RENDERED_ICONS) CLEANFILES += $(CLEAN_QT) @@ -422,3 +432,29 @@ moc_%.cpp: %.h @test -f $(LRELEASE) @$(MKDIR_P) $(@D) $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LRELEASE) -silent $< -qm $@ + +EXTRA_DIST += $(RES_RENDERED_ICON_SRC) + +if CAN_RENDER_ICONS + +qt/res/rendered_icons/bitcoin%.png: qt/res/src/bitcoin.svg + @$(MKDIR_P) $(@D) + $(RSVG_CONVERT) -f png -d $* -p $* < $< > $@ + +# NOTE: ImageMagick will never convert transparent PNGs to 8-bit ICOs, but GIF is fine +qt/res/rendered_icons/bitcoin%d8.gif: qt/res/rendered_icons/bitcoin%.png + $(IMAGEMAGICK_CONVERT) $^ -colors 256 -channel A -threshold '50%' $@ + +qt/res/rendered_icons/bitcoin.icns: $(patsubst %,qt/res/rendered_icons/bitcoin%.png,256 512 1024 32 16) + $(PNG2ICNS) $@ $^ + +qt/res/rendered_icons/bitcoin.ico: qt/res/rendered_icons/bitcoin32d8.gif $(patsubst %,qt/res/rendered_icons/bitcoin%.png,256 64 48 32 20 16) + $(IMAGEMAGICK_CONVERT) $^ $@ + +else + +qt/res/rendered_icons/%: qt/res/icons/% + @$(MKDIR_P) $(@D) + cp $< $@ + +endif diff --git a/src/qt/bitcoin.qrc b/src/qt/bitcoin.qrc index fed373e551..09ddd170e7 100644 --- a/src/qt/bitcoin.qrc +++ b/src/qt/bitcoin.qrc @@ -1,6 +1,6 @@ - res/icons/bitcoin.png + res/rendered_icons/bitcoin1024.png res/icons/address-book.png res/icons/send.png res/icons/connect0.png diff --git a/src/qt/res/bitcoin-qt-res.rc b/src/qt/res/bitcoin-qt-res.rc index e590b407b0..0bd9fc443e 100644 --- a/src/qt/res/bitcoin-qt-res.rc +++ b/src/qt/res/bitcoin-qt-res.rc @@ -1,4 +1,4 @@ -IDI_ICON1 ICON DISCARDABLE "icons/bitcoin.ico" +IDI_ICON1 ICON DISCARDABLE "rendered_icons/bitcoin.ico" IDI_ICON2 ICON DISCARDABLE "icons/bitcoin_testnet.ico" #include // needed for VERSIONINFO diff --git a/src/qt/res/src/bitcoin.svg b/src/qt/res/src/bitcoin.svg index 14cf0c5e11..d8da87394d 100644 --- a/src/qt/res/src/bitcoin.svg +++ b/src/qt/res/src/bitcoin.svg @@ -7,7 +7,7 @@