From ef5e8a1f704c8ec482dbbf045f7df40062369695 Mon Sep 17 00:00:00 2001 From: kichik Date: Wed, 3 Oct 2007 18:25:00 +0000 Subject: [PATCH] load default icon from the stub if the user didn't specify a different icon git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5310 212acab6-be3b-0410-9dea-997c60f758d6 --- Source/build.cpp | 7 +++++++ Source/icon.cpp | 41 ++++++++++++++++++++++++++++++++++++++++- Source/icon.h | 1 + 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/Source/build.cpp b/Source/build.cpp index d80bd567..f512f653 100644 --- a/Source/build.cpp +++ b/Source/build.cpp @@ -2376,6 +2376,13 @@ int CEXEBuild::write_output(void) AddStandardStrings(); try { + // Load icon from exe, if needed + if (installer_icon.empty()) + { + init_res_editor(); + installer_icon = load_icon_res(res_editor, IDI_ICON2); + } + // Set icon set_icon(res_editor, IDI_ICON2, installer_icon, uninstaller_icon); diff --git a/Source/icon.cpp b/Source/icon.cpp index 8023f27c..e32f185a 100644 --- a/Source/icon.cpp +++ b/Source/icon.cpp @@ -42,6 +42,45 @@ void free_loaded_icon(IconGroup icon) } } +IconGroup load_icon_res(CResourceEditor* re, WORD id) +{ + IconGroupHeader* header; + IconGroup result; + + LPBYTE group = re->GetResourceA( + RT_GROUP_ICON, MAKEINTRESOURCE(id), NSIS_DEFAULT_LANG); + + if (!group) + throw runtime_error("can't find icon group"); + + header = (IconGroupHeader*) group; + + for (WORD i = 0; i < header->wCount; i++) + { + Icon icon; + icon.index = i; + + RsrcIconGroupEntry* entry = (RsrcIconGroupEntry*) (group + + sizeof(IconGroupHeader) + SIZEOF_RSRC_ICON_GROUP_ENTRY * i); + + memcpy(&icon.meta, &entry->header, sizeof(IconGroupEntry)); + + WORD rsrc_id = FIX_ENDIAN_INT16(entry->wRsrcId); + + icon.data = re->GetResourceA(RT_ICON, MAKEINTRESOURCE(rsrc_id), NSIS_DEFAULT_LANG); + + if (!icon.data) + { + free_loaded_icon(result); + throw runtime_error("can't find icon"); + } + + result.push_back(icon); + } + + return result; +} + IconGroup load_icon_file(const char* filename) { IconGroupHeader iconHeader; @@ -49,7 +88,7 @@ IconGroup load_icon_file(const char* filename) FILE *file = open_icon(filename, iconHeader); - for (unsigned i = 0; i < iconHeader.wCount; i++) + for (WORD i = 0; i < iconHeader.wCount; i++) { Icon icon; icon.index = i; diff --git a/Source/icon.h b/Source/icon.h index 04570f5e..e71f28b3 100644 --- a/Source/icon.h +++ b/Source/icon.h @@ -61,6 +61,7 @@ typedef struct typedef std::vector IconGroup; IconGroup load_icon_file(const char* filename); +IconGroup load_icon_res(CResourceEditor* re, WORD id); void free_loaded_icon(IconGroup icon); void set_icon(CResourceEditor* re, WORD wIconId, IconGroup icon1, IconGroup icon2);