From 889289e5a038fa62d5f94dab1976e41cbd33b091 Mon Sep 17 00:00:00 2001 From: Simone Date: Wed, 29 Apr 2026 23:19:37 +0200 Subject: [PATCH] initial: nsAdvsplash plugin 1.0.0 --- .editorconfig | 24 + .gitattributes | 52 ++ .github/ISSUE_TEMPLATE/bug_report.yml | 76 +++ .github/ISSUE_TEMPLATE/config.yml | 8 + .github/ISSUE_TEMPLATE/feature_request.yml | 32 + .github/PULL_REQUEST_TEMPLATE.md | 31 + .github/workflows/build.yml | 66 ++ .github/workflows/release.yml | 99 +++ .gitignore | 63 ++ CHANGELOG.md | 26 + CONTRIBUTING.md | 137 +++++ LICENSE | 21 + README.md | 137 +++++ README_IT.md | 128 ++++ SECURITY.md | 40 ++ VERSION | 1 + build_plugin.py | 679 +++++++++++++++++++++ dist/amd64-unicode/newadvsplash.dll | Bin 0 -> 120832 bytes dist/x86-ansi/newadvsplash.dll | Bin 0 -> 98304 bytes dist/x86-unicode/newadvsplash.dll | Bin 0 -> 99328 bytes docs/legacy-vc6/advsplash.dsp | 177 ++++++ docs/legacy-vc6/advsplash.dsw | 28 + docs/original-readme.txt | 69 +++ docs/wiki.txt | 82 +++ examples/aist.gif | Bin 0 -> 8494 bytes examples/animbanner.nsi | 51 ++ examples/animsplash.nsi | 55 ++ examples/bannermui.nsi | 43 ++ examples/catch.ver.gif | Bin 0 -> 2044 bytes examples/example.nsi | 51 ++ examples/stopfade.nsi | 34 ++ examples/version.nsi | 38 ++ src/NewAdvSplash.vcxproj | 186 ++++++ src/advsplash.cpp | 539 ++++++++++++++++ src/exdll.h | 99 +++ src/gif.cpp | 257 ++++++++ 36 files changed, 3329 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 README_IT.md create mode 100644 SECURITY.md create mode 100644 VERSION create mode 100644 build_plugin.py create mode 100644 dist/amd64-unicode/newadvsplash.dll create mode 100644 dist/x86-ansi/newadvsplash.dll create mode 100644 dist/x86-unicode/newadvsplash.dll create mode 100644 docs/legacy-vc6/advsplash.dsp create mode 100644 docs/legacy-vc6/advsplash.dsw create mode 100644 docs/original-readme.txt create mode 100644 docs/wiki.txt create mode 100644 examples/aist.gif create mode 100644 examples/animbanner.nsi create mode 100644 examples/animsplash.nsi create mode 100644 examples/bannermui.nsi create mode 100644 examples/catch.ver.gif create mode 100644 examples/example.nsi create mode 100644 examples/stopfade.nsi create mode 100644 examples/version.nsi create mode 100644 src/NewAdvSplash.vcxproj create mode 100644 src/advsplash.cpp create mode 100644 src/exdll.h create mode 100644 src/gif.cpp diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..55629c5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,24 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 4 + +[*.{yml,yaml,json}] +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[*.{cmd,bat,ps1}] +end_of_line = crlf + +[*.{nsi,nsh,sln,vcxproj,filters}] +end_of_line = crlf + +[Makefile] +indent_style = tab diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..20b175b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,52 @@ +# Normalizzazione line endings +* text=auto eol=lf + +# File di codice +*.c text eol=lf +*.cpp text eol=lf +*.h text eol=lf +*.hpp text eol=lf +*.def text eol=lf +*.py text eol=lf +*.ps1 text eol=lf +*.cmd text eol=crlf +*.bat text eol=crlf + +# NSIS +*.nsi text eol=crlf +*.nsh text eol=crlf + +# Markdown / docs / config +*.md text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +*.json text eol=lf +*.txt text eol=lf +*.xml text eol=lf + +# Visual Studio (CRLF richiesto) +*.sln text eol=crlf +*.vcxproj text eol=crlf merge=union +*.filters text eol=crlf merge=union +*.rc binary +*.rc2 binary + +# Binari +*.dll binary +*.exe binary +*.lib binary +*.obj binary +*.pdb binary +*.zip binary +*.7z binary +*.png binary +*.ico binary +*.gif binary +*.jpg binary +*.jpeg binary +*.bmp binary +*.pdf binary + +# Linguistic detection (GitHub Linguist / Gitea analogo) +*.nsi linguist-language=NSIS +*.nsh linguist-language=NSIS diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..7599f2a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,76 @@ +name: Bug Report +description: Segnala un bug riproducibile +title: "[Bug]: " +labels: ["bug", "triage"] +body: + - type: markdown + attributes: + value: | + Grazie per la segnalazione. Compila i campi sotto per aiutarci a riprodurre il problema. + + - type: input + id: plugin-version + attributes: + label: Versione plugin + description: Contenuto del file VERSION o tag della release scaricata + placeholder: "1.6.0" + validations: + required: true + + - type: dropdown + id: architecture + attributes: + label: Architettura DLL usata + options: + - x86-ansi + - x86-unicode + - amd64-unicode + - non so / multiple + validations: + required: true + + - type: input + id: nsis-version + attributes: + label: Versione NSIS + placeholder: "3.10" + validations: + required: true + + - type: input + id: os + attributes: + label: Sistema operativo + placeholder: "Windows 11 23H2 x64" + validations: + required: true + + - type: textarea + id: repro + attributes: + label: Passi per riprodurre + description: Script .nsi minimale che riproduce il problema + render: nsis + validations: + required: true + + - type: textarea + id: expected + attributes: + label: Comportamento atteso + validations: + required: true + + - type: textarea + id: actual + attributes: + label: Comportamento osservato + description: Includi messaggi di errore esatti, output del log NSIS, screenshot + validations: + required: true + + - type: textarea + id: additional + attributes: + label: Note aggiuntive + description: Qualunque altra informazione utile (workaround tentati, ecc.) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..a505ba5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Domande generali + url: https://gitea.emulab.it/Simone/nsis-plugin-nsadvsplash/issues?type=question + about: Per domande di utilizzo che non sono bug, apri una issue con label "question" + - name: Security + url: https://gitea.emulab.it/Simone/nsis-plugin-nsadvsplash/security/advisories/new + about: Segnala vulnerabilità di security in privato (non aprire issue pubbliche) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..fae6d8d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,32 @@ +name: Feature Request +description: Suggerisci una nuova funzionalità o miglioramento +title: "[Feature]: " +labels: ["enhancement"] +body: + - type: textarea + id: problem + attributes: + label: Problema / Caso d'uso + description: Quale problema vorresti risolvere? Quale workflow vuoi abilitare? + validations: + required: true + + - type: textarea + id: proposal + attributes: + label: Proposta + description: Come dovrebbe funzionare? Includi esempio di API/uso negli script NSIS se possibile. + render: nsis + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternative considerate + description: Altri approcci che hai valutato e perché sono stati scartati + + - type: textarea + id: additional + attributes: + label: Note aggiuntive diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..3758b50 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,31 @@ +## Descrizione + + + +## Tipo di Modifica + +- [ ] Bug fix (modifica non breaking che risolve un problema) +- [ ] Feature (modifica non breaking che aggiunge funzionalità) +- [ ] Breaking change (fix o feature che rompe la compatibilità) +- [ ] Documentazione +- [ ] Build / CI + +## Architetture Testate + +- [ ] `x86-ansi` +- [ ] `x86-unicode` +- [ ] `amd64-unicode` + +## Checklist + +- [ ] Build completa senza warning: `python build_plugin.py` +- [ ] CHANGELOG.md aggiornato (sezione `[Unreleased]`) +- [ ] README / docs aggiornati se l'API è cambiata +- [ ] Esempi aggiornati se l'API è cambiata +- [ ] Conventional Commits rispettato +- [ ] Nessun file in `dist/` o `__pycache__/` committato +- [ ] Self-review completata + +## Note Aggiuntive + + diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..4102e1e --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,66 @@ +# Build (GitHub) — pipeline CI primaria +# +# Strategia hosting: +# - Repo primario su Gitea (push iniziale) +# - Push mirror automatico Gitea -> GitHub +# - GitHub esegue TUTTA la CI (Gitea non esegue Actions) +# +# Trigger: +# - push su main (incluso quello propagato dal mirror Gitea) +# - PR aperte su GitHub +# - run manuale via UI + +name: Build + +on: + push: + branches: [main] + paths-ignore: + - '**.md' + - 'docs/**' + - 'examples/**' + pull_request: + branches: [main] + workflow_dispatch: + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + +jobs: + build: + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + config: [x86-ansi, x86-unicode, x64-unicode] + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Setup MSBuild + uses: microsoft/setup-msbuild@v2 + + - name: Read VERSION + id: version + shell: pwsh + run: | + $v = (Get-Content VERSION -Raw).Trim() + "version=$v" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + + - name: Build ${{ matrix.config }} + run: python build_plugin.py --config ${{ matrix.config }} --verbosity minimal + + - name: Upload DLL + uses: actions/upload-artifact@v4 + with: + name: ${{ github.event.repository.name }}-${{ steps.version.outputs.version }}-${{ matrix.config }} + path: dist/** + if-no-files-found: error + retention-days: 30 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..e4cf67d --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,99 @@ +# Release (GitHub) — pipeline release primaria +# +# Triggerata quando un tag v* viene propagato dal mirror Gitea. +# Costruisce gli artifact per tutte le architetture e crea la GitHub Release. + +name: Release + +on: + push: + tags: ['v*'] + workflow_dispatch: + inputs: + tag: + description: 'Tag versione (es. v1.7.0)' + required: true + +permissions: + contents: write + +jobs: + build: + runs-on: windows-latest + strategy: + fail-fast: true + matrix: + config: [x86-ansi, x86-unicode, x64-unicode] + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - uses: microsoft/setup-msbuild@v2 + + - name: Build ${{ matrix.config }} + run: python build_plugin.py --config ${{ matrix.config }} + + - name: Determine version & arch + id: meta + shell: pwsh + run: | + $tag = "${{ github.ref_name }}" + if ([string]::IsNullOrEmpty($tag) -or $tag -eq "main") { $tag = "${{ inputs.tag }}" } + $v = $tag -replace '^v','' + $map = @{ 'x86-ansi' = 'x86-ansi'; 'x86-unicode' = 'x86-unicode'; 'x64-unicode' = 'amd64-unicode' } + $dir = $map['${{ matrix.config }}'] + echo "version=$v" >> $env:GITHUB_OUTPUT + echo "tag=$tag" >> $env:GITHUB_OUTPUT + echo "dir=$dir" >> $env:GITHUB_OUTPUT + + - name: Package + shell: pwsh + run: | + $name = "${{ github.event.repository.name }}-${{ steps.meta.outputs.version }}-${{ steps.meta.outputs.dir }}" + $stage = "stage/$name" + New-Item -ItemType Directory -Force -Path $stage | Out-Null + Copy-Item "dist/${{ steps.meta.outputs.dir }}/*" $stage -Recurse + Copy-Item README.md, LICENSE, VERSION, CHANGELOG.md $stage + if (Test-Path "include") { Copy-Item "include" $stage -Recurse } + if (Test-Path "examples") { Copy-Item "examples" $stage -Recurse } + Compress-Archive -Path "$stage/*" -DestinationPath "$name.zip" -Force + + - uses: actions/upload-artifact@v4 + with: + name: pkg-${{ matrix.config }} + path: '*.zip' + + publish: + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/download-artifact@v4 + with: + path: artifacts + merge-multiple: true + + - name: SHA256SUMS + run: | + cd artifacts + sha256sum *.zip > SHA256SUMS.txt + cat SHA256SUMS.txt + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + files: | + artifacts/*.zip + artifacts/SHA256SUMS.txt + generate_release_notes: true + body: | + **Repository primario**: vedi link Gitea nel README. + + Il mirror GitHub è generato automaticamente dal repo Gitea (sorgente di verità). + Per issue e PR aprire ticket sul repository primario Gitea. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2c3a730 --- /dev/null +++ b/.gitignore @@ -0,0 +1,63 @@ +# Build output (src/ subdirs only — dist/ is tracked, contains pre-built DLLs) +bin/ +obj/ +Build/ +build/ + +# Visual Studio +*.user +*.suo +*.ncb +*.sdf +.vs/ +ipch/ +*.VC.db +*.VC.VC.opendb +*.opendb +*.aps +*.tlog +*.idb +*.pdb +*.ilk +*.exp +*.lib +*.obj + +# Python +__pycache__/ +*.pyc +*.pyo +.pytest_cache/ +*.egg-info/ +.venv/ +venv/ + +# Editor / IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +Thumbs.db +desktop.ini +.DS_Store + +# NSIS +*.nsh.bak + +# Logs +*.log +.logs/ + +# Sensitive +.env +.env.local +*.pem +*.key + +# Migration/automation scripts (temporary, contain tokens — never commit) +tools/t*.py +tools/check_*.py +tools/legacy/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..a8e9ada --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,26 @@ +# Changelog + +Tutte le modifiche rilevanti a questo progetto sono documentate in questo file. + +Il formato segue [Keep a Changelog](https://keepachangelog.com/it/1.0.0/), +e il progetto aderisce al [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [1.0.1] — 2026-04-29 + +### Changed +- Build script completamente riscritto: Colors, Spinner, BuildConfig, build parallelo con ThreadPoolExecutor, CPU info, output colorato OK/FAIL +- CI: rimosso flag `--verbose` (non esistente) in favore di `--verbosity minimal` + +## [1.0.0] — 2026-04-29 + +### Added +- Prima release come repository indipendente +- Build script unificato (`build_plugin.py`) con CLI canonica +- CI/CD via GitHub Actions (mirror automatico Gitea → GitHub) +- Documentazione completa (README, CONTRIBUTING, SECURITY) + +[Unreleased]: https://gitea.emulab.it/Simone/nsis-plugin-nsadvsplash/compare/v1.0.1...HEAD +[1.0.1]: https://gitea.emulab.it/Simone/nsis-plugin-nsadvsplash/compare/v1.0.0...v1.0.1 +[1.0.0]: https://gitea.emulab.it/Simone/nsis-plugin-nsadvsplash/releases/tag/v1.0.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..a0d8792 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,137 @@ +# Contribuire a nsAdvsplash + +Grazie per il tuo interesse a contribuire! + +> Repository primario: [https://gitea.emulab.it/Simone/nsis-plugin-nsadvsplash](https://gitea.emulab.it/Simone/nsis-plugin-nsadvsplash) +> Mirror GitHub: [https://github.com/systempal/nsis-plugin-nsadvsplash](https://github.com/systempal/nsis-plugin-nsadvsplash) (read-only — apri PR su Gitea) + +## Prerequisiti + +| Strumento | Versione | Note | +|-----------|----------|------| +| Visual Studio | 2022 / 2026 | Workload: Desktop development with C++ (toolset v143/v145) | +| Python | 3.7+ | Per `build_plugin.py` | +| Git | 2.30+ | Con supporto submoduli se applicabile | + +## Quick Start + +```powershell +git clone https://gitea.emulab.it/Simone/nsis-plugin-nsadvsplash.git +cd nsis-plugin-nsadvsplash +python build_plugin.py +``` + +Output in `dist/{x86-ansi,x86-unicode,amd64-unicode}/`. + +## Workflow Sviluppo + +### 1. Branch + +```powershell +git checkout -b feat/nome-feature # nuova feature +git checkout -b fix/descrizione-bug # bugfix +git checkout -b docs/aggiornamento # solo doc +git checkout -b chore/manutenzione # build, dipendenze +``` + +### 2. Commit + +Segui [Conventional Commits](https://www.conventionalcommits.org/it/v1.0.0/): + +``` +feat: aggiunge supporto per formato XYZ +fix: corregge crash su Windows 11 ARM +docs: aggiorna esempio di utilizzo +chore: aggiorna toolset MSVC +refactor: estrae logica parsing in funzione separata +test: aggiunge test per edge case +build: aggiorna script di build +ci: aggiorna workflow GitHub Actions +``` + +Breaking changes: + +``` +feat!: rinomina API Foo() in Bar() + +BREAKING CHANGE: Foo() rinominata in Bar(); aggiornare tutti i chiamanti. +``` + +### 3. Pull Request + +PR aperte verso il branch `main` su Gitea. Verifica: + +- [ ] Build completa senza warning per tutte le architetture: `python build_plugin.py` +- [ ] Esempi aggiornati se cambia l'API +- [ ] `CHANGELOG.md` aggiornato (sezione `[Unreleased]`) +- [ ] Documentazione aggiornata (README, docs/API.md se esiste) +- [ ] Conventional Commits rispettato +- [ ] Nessun file in `dist/` o `__pycache__/` committato + +## Build Script + +``` +python build_plugin.py [opzioni] +``` + +| Opzione | Default | Descrizione | +|---------|---------|-------------| +| `--config` | `all` | Architettura: `x86-ansi`, `x86-unicode`, `x64-unicode`, `all` | +| `--toolset` | `auto` | Visual Studio: `2022`, `2026`, `auto` (rileva il più recente) | +| `--jobs` | numero CPU | Thread paralleli per la build | +| `--clean` | false | Pulisce `dist/` prima di compilare | +| `--install-dir` | none | Copia DLL anche in `/{arch}/` (es. NSIS plugin folder) | +| `--verbose` | false | Output dettagliato (mostra comandi MSBuild) | + +Exit codes: +- `0` — Successo +- `1` — Errore di build +- `2` — Prerequisiti mancanti +- `3` — Argomenti invalidi + +## Release Workflow + +Le release sono automatiche via tag Git: + +```powershell +# 1. Aggiorna VERSION e CHANGELOG.md +echo "1.7.0" > VERSION +# (modifica CHANGELOG.md spostando entry da [Unreleased] a [1.7.0]) + +# 2. Commit +git add VERSION CHANGELOG.md +git commit -m "chore(release): v1.7.0" + +# 3. Tag annotato +git tag -a v1.7.0 -m "Release v1.7.0" + +# 4. Push +git push origin main +git push origin v1.7.0 +``` + +Il workflow `.github/workflows/release.yml` compilerà tutte le architetture +e creerà la release su Gitea con gli artifact ZIP allegati. Il mirror GitHub +riceverà automaticamente il tag. + +## Code Style + +- C/C++: stile coerente con il file modificato +- Python: PEP 8 (4 spazi indent, line length flessibile) +- Header file: `#include` ordinati: stdlib → Win32 → progetto +- Encoding: UTF-8 senza BOM (eccetto `.rc` che richiede UTF-16 LE) +- Line endings: LF in repo (`.gitattributes` normalizza) + +## Reporting Bug + +Apri una [issue](https://gitea.emulab.it/Simone/nsis-plugin-nsadvsplash/issues/new) usando il template "Bug Report". +Includi: +- Versione plugin e architettura DLL usata +- Versione NSIS +- Sistema operativo +- Script `.nsi` minimale che riproduce il problema +- Output / errore esatto + +## Domande + +Per domande generali, apri una [issue](https://gitea.emulab.it/Simone/nsis-plugin-nsadvsplash/issues) con label `question`. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bc3fdc5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +zlib License + +Copyright (c) 2026 Simone + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. diff --git a/README.md b/README.md new file mode 100644 index 0000000..aea4d35 --- /dev/null +++ b/README.md @@ -0,0 +1,137 @@ +# NewAdvSplash NSIS Plugin + +**Personal modified version** + +--- + +## Original Description + +NewAdvSplash.dll - plug-in that lets you throw up a splash screen in NSIS installers with fading effects (win2k/xp) and transparency. At the same time can play wav-mp3 sound file. + +## Usage + +### 1) Show splash screen + +```nsis +newadvsplash::show [/NOUNLOAD] Delay FadeIn FadeOut KeyColor [/BANNER] [/PASSIVE] [/NOCANCEL] FileName +``` + +**Parameters:** +- `Delay` - time (milliseconds) to show image +- `FadeIn` - time to show the fadein scene +- `FadeOut` - time to show the fadeout scene +- `KeyColor` - color used for transparency, could be any RGB value (for ex. R=255 G=100 B=16 -> KeyColor=0xFF6410). Use KeyColor=-1 if there is no transparent color at your image. If KeyColor=-2 and image type is gif, plug-in attempts to extract transparency color value from the file header. For gif images transparency on the static background works even if KeyColor=-1. +- `/BANNER` - returns control to installer immediately after plug-in activation. Not depends on installer page - parent window NULL. +- `/NOCANCEL` - disables 'exit on user click' default behaviour. +- `/PASSIVE` - not forces splash window to foreground. +- `FileName` - splash image filename (with extension!). Bmp, gif and jpg image types are supported. + +**Examples:** + +```nsis +newadvsplash::show 3000 0 0 -2 "$PLUGINSDIR\catch.gif" +``` + +```nsis +newadvsplash::show /NOUNLOAD 1000 600 400 0xFF6410 /BANNER "$TEMP\spltmp.bmp" +``` + +Use /NOUNLOAD with /BANNER key - this case plug-in not waits for the end of 'show' and returns control to installer. If used in .onInit function, /BANNER key requires 'ShowWindow $HWNDPARENT 2' in .onGUIInit + +### 2) Stop splash + +```nsis +newadvsplash::stop [/WAIT | /FADEOUT] +``` + +- Without options terminates banner. +- With `/WAIT` option waits for the end. +- With `/FADEOUT` option forces banner close with fade out effect ('Delay' -> 0). + +### 3) Play sound + +```nsis +newadvsplash::play /NOUNLOAD [/LOOP] FileName +``` + +- `FileName` - sound filename to play (with extension, wav, mp3 ...). +- Empty Filename string "" stops sound. + +**Example:** + +```nsis +newadvsplash::play /NOUNLOAD /LOOP "$PLUGINSDIR\snd.mp3" +newadvsplash::show 2000 1000 500 -1 "$PLUGINSDIR\iamfat.jpg" +``` + +### 4) Get window handle + +```nsis +newadvsplash::hwnd /NOUNLOAD +Pop $0 ; $0 is window handle now +``` + +## Compatibility + +- Basic - Win95 and later. +- Fadein/fadeout - win2k/winxp. + +## Credits + +- Original code - Justin +- Converted to a plugin DLL by Amir Szekely (kichik) +- Fading and transparency by Nik Medved (brainsucker) +- Gif and jpeg support, /BANNER and /CANCEL, mp3 support - Takhir Bedertdinov + +--- + +## ⚠️ Differences in the Personal Version + +### New supported architecture: x64 (amd64-unicode) + +The original supported only: +- x86-ansi (Plugins\newadvsplash.dll) +- x86-unicode (Unicode\plugins\newadvsplash.dll) + +The personal version adds support for: +- **amd64-unicode** (x64) + +### Added Files + +- `build_plugin.py` - Python script to compile the plugin for all architectures +- `src/exdll.h` - Header for the NSIS extern DLL API +- `src/NewAdvSplash.vcxproj` - Visual Studio project updated for VS2022 and x64 + +### Removed Files + +Pre-compiled DLL files have been removed from the distribution as they are generated by the build: + +- `Plugins/newadvsplash.dll` +- `Unicode/plugins/newadvsplash.dll` + +### Build + +```cmd +cd nsAdvsplash +python build_plugin.py +``` + +DLLs are copied to `dist/{platform}/newadvsplash.dll`. + +### Build Options + +```powershell +python build_plugin.py --config x86-unicode # Single architecture (x86-ansi|x86-unicode|x64-unicode|all) +python build_plugin.py --vs-version 2026 # Specific VS version (2022|2026|auto) +python build_plugin.py --clean # Clean dist/ before build +python build_plugin.py --install-dir "C:\NSIS\Plugins" # Copy to additional NSIS directory +python build_plugin.py --verbosity minimal # MSBuild verbosity (quiet|minimal|normal|detailed|diagnostic) +``` + +### Functional Changes + +No functional changes compared to the original. Modifications are limited to the build infrastructure and x64 support. + +--- + +*See [README_IT.md](README_IT.md) for the Italian version.* diff --git a/README_IT.md b/README_IT.md new file mode 100644 index 0000000..b35b96e --- /dev/null +++ b/README_IT.md @@ -0,0 +1,128 @@ +# NewAdvSplash NSIS Plugin + +**Versione personale modificata** + +--- + +## Descrizione Originale + +NewAdvSplash.dll - plug-in che permette di visualizzare uno splash screen negli installer NSIS con effetti di dissolvenza (win2k/xp) e trasparenza. Può contemporaneamente riprodurre file audio wav/mp3. + +## Utilizzo + +### 1) Mostra splash screen + +```nsis +newadvsplash::show [/NOUNLOAD] Delay FadeIn FadeOut KeyColor [/BANNER] [/PASSIVE] [/NOCANCEL] FileName +``` + +**Parametri:** +- `Delay` - tempo (millisecondi) di visualizzazione dell'immagine +- `FadeIn` - tempo per la scena di fade in +- `FadeOut` - tempo per la scena di fade out +- `KeyColor` - colore usato per la trasparenza, può essere qualsiasi valore RGB (es. R=255 G=100 B=16 -> KeyColor=0xFF6410). Usare KeyColor=-1 se non c'è colore trasparente. Se KeyColor=-2 e il tipo è gif, il plug-in tenta di estrarre il colore di trasparenza dall'header del file. +- `/BANNER` - restituisce il controllo all'installer subito dopo l'attivazione del plug-in. +- `/NOCANCEL` - disabilita il comportamento default 'exit on user click'. +- `/PASSIVE` - non forza la finestra splash in primo piano. +- `FileName` - nome file immagine splash (con estensione!). Tipi supportati: Bmp, gif e jpg. + +**Esempi:** + +```nsis +newadvsplash::show 3000 0 0 -2 "$PLUGINSDIR\catch.gif" +``` + +```nsis +newadvsplash::show /NOUNLOAD 1000 600 400 0xFF6410 /BANNER "$TEMP\spltmp.bmp" +``` + +### 2) Ferma splash + +```nsis +newadvsplash::stop [/WAIT | /FADEOUT] +``` + +- Senza opzioni termina il banner. +- Con `/WAIT` attende la fine. +- Con `/FADEOUT` forza la chiusura con effetto fade out. + +### 3) Riproduci audio + +```nsis +newadvsplash::play /NOUNLOAD [/LOOP] FileName +``` + +- `FileName` - file audio da riprodurre (con estensione, wav, mp3...). +- Stringa vuota "" ferma l'audio. + +### 4) Ottieni handle finestra + +```nsis +newadvsplash::hwnd /NOUNLOAD +Pop $0 ; $0 è ora l'handle della finestra +``` + +## Compatibilità + +- Base - Win95 e successivi. +- Fadein/fadeout - win2k/winxp. + +## Crediti + +- Codice originale - Justin +- Convertito in plugin DLL da Amir Szekely (kichik) +- Dissolvenza e trasparenza di Nik Medved (brainsucker) +- Supporto gif e jpeg, /BANNER e /CANCEL, supporto mp3 - Takhir Bedertdinov + +--- + +## ⚠️ Differenze nella versione personale + +### Nuova architettura supportata: x64 (amd64-unicode) + +L'originale supportava solo: +- x86-ansi (Plugins\newadvsplash.dll) +- x86-unicode (Unicode\plugins\newadvsplash.dll) + +La versione personale aggiunge il supporto per: +- **amd64-unicode** (x64) + +### File aggiunti + +- `build_plugin.py` - Script Python per compilare il plugin per tutte le architetture +- `src/exdll.h` - Header per l'API NSIS extern DLL +- `src/NewAdvSplash.vcxproj` - Progetto Visual Studio aggiornato per VS2022 e x64 + +### File rimossi + +I file DLL precompilati sono stati rimossi dalla distribuzione in quanto vengono generati dalla compilazione: + +- `Plugins/newadvsplash.dll` +- `Unicode/plugins/newadvsplash.dll` + +### Compilazione + +```cmd +cd nsAdvsplash +python build_plugin.py +``` + +I DLL vengono copiati in `dist/{platform}/newadvsplash.dll`. + +### Opzioni build + +```powershell +python build_plugin.py --config x86-unicode # Solo un'architettura (x86-ansi|x86-unicode|x64-unicode|all) +python build_plugin.py --vs-version 2026 # Versione VS specifica (2022|2026|auto) +python build_plugin.py --clean # Pulizia dist/ prima della build +python build_plugin.py --install-dir "C:\NSIS\Plugins" # Copia in directory NSIS aggiuntiva +python build_plugin.py --verbosity minimal # Verbosità MSBuild (quiet|minimal|normal|detailed|diagnostic) +``` + +### Modifiche funzionali + +Nessuna modifica funzionale rispetto all'originale. Le modifiche riguardano solo l'infrastruttura di build e il supporto x64. + +--- + +*See [README.md](README.md) for the English version.* diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..9a7c1f5 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,40 @@ +# Security Policy + +## Versioni Supportate + +Solo l'ultima versione minor riceve fix di security. + +| Versione | Supporto | +|----------|----------| +| Latest minor (es. 1.0.0) | ✅ | +| Versioni precedenti | ❌ | + +## Reporting di una Vulnerabilità + +**Non aprire issue pubbliche per vulnerabilità di security.** + +Per segnalare una vulnerabilità: + +1. **Preferito**: usa la funzione [Security Advisory privato](https://gitea.emulab.it/Simone/nsis-plugin-nsadvsplash/security/advisories/new) di Gitea +2. **Alternativa**: invia email a `security@example.com` (sostituire con email reale prima del primo release) + +Includi: +- Descrizione della vulnerabilità +- Passi per riprodurla +- Versione/i affette +- Possibile mitigazione (se nota) + +## Tempo di Risposta + +- Acknowledgment iniziale: entro 7 giorni +- Valutazione: entro 14 giorni +- Patch (se confermata): tempistiche dipendono dalla severità + +## Hardening + +Questo plugin gira con i permessi del processo NSIS chiamante (tipicamente +l'utente che esegue l'installer). Non richiede privilegi elevati per la +compilazione né per l'esecuzione, salvo dove esplicitamente documentato. + +DLL distribuite tramite Releases sono compilate da CI GitHub Actions con +toolchain pinnata. Verificare hash SHA256 pubblicati nelle release. diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..afaf360 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.0.0 \ No newline at end of file diff --git a/build_plugin.py b/build_plugin.py new file mode 100644 index 0000000..1342c4d --- /dev/null +++ b/build_plugin.py @@ -0,0 +1,679 @@ +#!/usr/bin/env python3 +""" +Build script for NewAdvSplash plugin - All configurations +Supports multiple build configurations with flexible parameters +""" + +import argparse +import errno +import multiprocessing +import os +import shutil +import stat +import subprocess +import sys +import threading +import time +import xml.etree.ElementTree as ET +from concurrent.futures import ThreadPoolExecutor, as_completed +from pathlib import Path +from typing import List, Optional, Tuple + +# Ensure stdout/stderr handle Unicode on Windows CI (cp1252 default breaks non-ASCII) +if sys.stdout.encoding and sys.stdout.encoding.lower() not in ('utf-8', 'utf_8'): + import io + sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') + sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace') + + +# --------------------------------------------------------------------------- +# Filesystem helpers +# --------------------------------------------------------------------------- + +def _on_rmtree_error(func, path, exc_info): + if func in (os.unlink, os.rmdir) and exc_info[1].errno == errno.EACCES: + try: + os.chmod(path, stat.S_IWRITE) + func(path) + return + except Exception: + pass + for i in range(5): + try: + time.sleep(0.1 * (i + 1)) + if os.path.isdir(path): + shutil.rmtree(path) + else: + os.unlink(path) + return + except Exception: + pass + raise exc_info[1] + + +def robust_rmtree(path): + if not os.path.exists(path): + return + try: + shutil.rmtree(path, onexc=_on_rmtree_error) + except TypeError: + try: + shutil.rmtree(path, onerror=_on_rmtree_error) + except Exception: + pass + except Exception: + try: + shutil.rmtree(path, ignore_errors=True) + except Exception: + pass + + +# --------------------------------------------------------------------------- +# Colors & Spinner +# --------------------------------------------------------------------------- + +class Colors: + CYAN = "\033[36m" + GREEN = "\033[32m" + YELLOW = "\033[33m" + RED = "\033[31m" + GRAY = "\033[90m" + BLUE = "\033[34m" + RESET = "\033[0m" + BOLD = "\033[1m" + BRIGHT_GREEN = "\033[92m" + BRIGHT_CYAN = "\033[96m" + BRIGHT_WHITE = "\033[97m" + BRIGHT_YELLOW = "\033[93m" + BRIGHT_RED = "\033[91m" + + +class Spinner: + def __init__(self, message: str = "Building...", delay: float = 0.1, total: int = 0): + self.spinner = ['\u280b', '\u2819', '\u2839', '\u2838', '\u283c', '\u2834', '\u2826', '\u2827', '\u2807', '\u280f'] + self.delay = delay + self.message = message + self.running = False + self.thread = None + self.start_time = time.time() + + def update(self, current=None): + pass + + def _spin(self): + idx = 0 + _block = '\u28ff' + while self.running: + elapsed = time.time() - self.start_time + n_blocks = int(elapsed // 2) + time_blocks = f"{Colors.YELLOW}{_block * n_blocks}{Colors.RESET}" + spin_char = f"{Colors.YELLOW}{self.spinner[idx % len(self.spinner)]}{Colors.RESET}" + msg = f"{Colors.BOLD}{Colors.CYAN}{self.message}{Colors.RESET}" + time_str = f"{Colors.GREEN}{int(elapsed)}s{Colors.RESET}" + sys.stdout.write(f"\r{msg} {time_str} {time_blocks}{spin_char} ") + sys.stdout.flush() + idx += 1 + time.sleep(self.delay) + sys.stdout.write("\r" + " " * (len(self.message) + 80) + "\r") + sys.stdout.flush() + + def __enter__(self): + if sys.stdout.isatty(): + self.running = True + self.thread = threading.Thread(target=self._spin, daemon=True) + self.thread.start() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + if self.running: + self.running = False + if self.thread: + self.thread.join() + + +# --------------------------------------------------------------------------- +# Build configuration +# --------------------------------------------------------------------------- + +class BuildConfig: + def __init__(self, name: str, config: str, platform: str, dest_dir: str): + self.name = name + self.config = config + self.platform = platform + self.dest_dir = dest_dir + + +CONFIGS = { + 'x86-ansi': BuildConfig('x86-ansi', 'Release', 'Win32', 'x86-ansi'), + 'x86-unicode': BuildConfig('x86-unicode', 'Release Unicode', 'Win32', 'x86-unicode'), + 'x64-unicode': BuildConfig('x64-unicode', 'Release Unicode', 'x64', 'amd64-unicode'), +} + +DLL_NAME = 'newadvsplash.dll' +_VSWHERE = Path(r'C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe') +_VS_RANGES = {'2026': '[18.0,19.0)', '2022': '[17.0,18.0)'} +_VS_TOOLSETS = {'2026': 'v145', '2022': 'v143'} + + +# --------------------------------------------------------------------------- +# MSBuild discovery +# --------------------------------------------------------------------------- + +def _find_msbuild_vswhere(vs_version: str) -> Optional[Tuple[Path, str, str]]: + if not _VSWHERE.exists(): + return None + to_try = ['2026', '2022'] if vs_version == 'auto' else [vs_version] + for ver in to_try: + if ver not in _VS_RANGES: + continue + try: + result = subprocess.run( + [str(_VSWHERE), '-version', _VS_RANGES[ver], '-latest', + '-requires', 'Microsoft.Component.MSBuild', + '-find', r'MSBuild\**\Bin\MSBuild.exe'], + capture_output=True, text=True, timeout=15, + ) + if result.returncode == 0: + lines = [ln.strip() for ln in result.stdout.splitlines() if ln.strip()] + if lines: + p = Path(lines[0]) + if p.exists(): + return p, _VS_TOOLSETS[ver], ver + except Exception: + pass + return None + + +def find_msbuild(vs_version: str = 'auto') -> Optional[Tuple[Path, str, str]]: + result = _find_msbuild_vswhere(vs_version) + if result: + return result + # Fallback: well-known paths + to_try = ['2026', '2022'] if vs_version == 'auto' else [vs_version] + for ver in to_try: + for edition in ('Community', 'Professional', 'Enterprise', 'BuildTools'): + p = Path(rf'C:\Program Files\Microsoft Visual Studio\{ver}\{edition}\MSBuild\Current\Bin\MSBuild.exe') + if p.exists(): + return p, _VS_TOOLSETS[ver], ver + return None + + +# --------------------------------------------------------------------------- +# Project paths & version +# --------------------------------------------------------------------------- + +def get_project_paths() -> Tuple[Path, Path, Path]: + script_dir = Path(__file__).parent.absolute() + project_dir = script_dir / 'src' + project_file = project_dir / 'NewAdvSplash.vcxproj' + dist_dir = script_dir / 'dist' + return project_dir, project_file, dist_dir + + +def get_plugins_dir() -> Optional[Path]: + """Return workspace-level plugins/ dir (4 levels above src/modules//).""" + p = Path(__file__).parent.parent.parent.parent / 'plugins' + return p if p.is_dir() else None + + +def read_version() -> str: + vf = Path(__file__).parent / 'VERSION' + try: + return vf.read_text(encoding='utf-8-sig').strip() + except Exception: + return '0.0.0' + + +# --------------------------------------------------------------------------- +# CPU info & build optimizations +# --------------------------------------------------------------------------- + +def get_cpu_info() -> dict: + try: + import psutil + logical = psutil.cpu_count(logical=True) + physical = psutil.cpu_count(logical=False) + return {'logical_cores': logical, 'physical_cores': physical, + 'has_hyperthreading': logical > physical, 'has_psutil': True} + except ImportError: + n = multiprocessing.cpu_count() + return {'logical_cores': n, 'physical_cores': n, + 'has_hyperthreading': False, 'has_psutil': False} + + +def get_optimal_threads() -> int: + info = get_cpu_info() + return info['physical_cores'] if info['has_hyperthreading'] and info['physical_cores'] > 1 else info['logical_cores'] + + +def get_build_optimizations() -> List[str]: + return [ + '/p:BuildInParallel=true', + '/p:MultiProcessorCompilation=true', + '/p:PreferredToolArchitecture=x64', + '/p:UseSharedCompilation=true', + '/nodeReuse:true', + '/p:GenerateResourceUsePreserializedResources=true', + ] + + +def get_memory_optimizations() -> List[str]: + try: + import psutil + gb = psutil.virtual_memory().total / (1024 ** 3) + if gb >= 16: + return ['/p:DisableFastUpToDateCheck=false', '/p:BuildProjectReferences=true', + '/p:UseCommonOutputDirectory=false'] + elif gb >= 8: + return ['/p:DisableFastUpToDateCheck=false'] + return [] + except ImportError: + return ['/p:DisableFastUpToDateCheck=false'] + + +def print_cpu_info(use_parallel: bool, use_optimizations: bool = True) -> None: + if not use_parallel: + print(f"{Colors.CYAN}Build mode: {Colors.RESET} {Colors.BOLD}Single-threaded{Colors.RESET}") + if use_optimizations: + print(f"{Colors.CYAN}Optimizations: {Colors.RESET} {Colors.GREEN}ENABLED{Colors.RESET} {Colors.GRAY}(memory, caching){Colors.RESET}") + return + + info = get_cpu_info() + optimal = get_optimal_threads() + print(f"{Colors.CYAN}Build mode: {Colors.RESET} {Colors.BRIGHT_WHITE}{'Parallel' if use_parallel else 'Sequential'}{Colors.RESET}") + print(f"{Colors.CYAN}Logical cores: {Colors.RESET} {Colors.BRIGHT_WHITE}{info['logical_cores']}{Colors.RESET}") + print(f"{Colors.CYAN}Physical cores: {Colors.RESET} {Colors.BRIGHT_WHITE}{info['physical_cores']}{Colors.RESET}") + if info['has_hyperthreading']: + print(f"{Colors.CYAN}Hyperthreading: {Colors.RESET} {Colors.BRIGHT_GREEN}ENABLED{Colors.RESET}") + print(f"{Colors.CYAN}Optimal threads: {Colors.RESET} {Colors.BRIGHT_WHITE}{optimal}{Colors.RESET} {Colors.GRAY}(using physical cores){Colors.RESET}") + else: + print(f"{Colors.CYAN}Hyperthreading: {Colors.RESET} {Colors.GRAY}NOT AVAILABLE{Colors.RESET}") + print(f"{Colors.CYAN}Optimal threads: {Colors.RESET} {Colors.BRIGHT_WHITE}{optimal}{Colors.RESET}") + print(f"{Colors.CYAN}MSBuild threads: {Colors.RESET} {Colors.BRIGHT_WHITE}{optimal}{Colors.RESET}") + if use_optimizations: + print(f"{Colors.CYAN}Optimizations: {Colors.RESET} {Colors.BRIGHT_GREEN}ENABLED{Colors.RESET} {Colors.GRAY}(parallel, memory, caching){Colors.RESET}") + try: + import psutil + gb = psutil.virtual_memory().total / (1024 ** 3) + print(f"{Colors.CYAN}Available memory: {Colors.RESET} {Colors.BRIGHT_WHITE}{gb:.1f} GB{Colors.RESET}") + except ImportError: + print(f"{Colors.CYAN}Available memory: {Colors.RESET} {Colors.GRAY}Unknown (install psutil){Colors.RESET}") + else: + print(f"{Colors.CYAN}Optimizations: {Colors.RESET} {Colors.BRIGHT_RED}DISABLED{Colors.RESET}") + if not info['has_psutil']: + print(f"{Colors.GRAY}Note: Install 'psutil' for detailed CPU/memory info (pip install psutil){Colors.RESET}") + print() + + +# --------------------------------------------------------------------------- +# Build helpers +# --------------------------------------------------------------------------- + +def format_time(seconds: float) -> str: + if seconds < 60: + return f"{seconds:.2f}s" + elif seconds < 3600: + return f"{int(seconds // 60)}m {seconds % 60:.1f}s" + return f"{int(seconds // 3600)}h {int((seconds % 3600) // 60)}m {seconds % 60:.0f}s" + + +def build_configuration( + msbuild_path: Path, + project_file: Path, + config: BuildConfig, + platform_toolset: str, + *, + rebuild: bool = True, + verbosity: str = 'quiet', + parallel: bool = True, + optimizations: bool = True, + counter: str = "", + capture_output: bool = False, +) -> Tuple[bool, float, str]: + optimal = get_optimal_threads() + cmd = [ + str(msbuild_path), + str(project_file), + f'/t:{"Rebuild" if rebuild else "Build"}', + f'/p:Configuration={config.config}', + f'/p:Platform={config.platform}', + f'/p:OutDir=Build\\{config.name}\\', + f'/p:IntDir=Build\\{config.name}\\obj\\', + '/p:WindowsTargetPlatformVersion=10.0', + f'/p:PlatformToolset={platform_toolset}', + f'/v:{verbosity}', + ] + if parallel: + cmd += [f'/maxcpucount:{optimal}', '/p:UseMultiToolTask=true', f'/p:CL_MPCount={optimal}'] + cmd += ['/p:Optimization=MaxSpeed', '/p:ExceptionHandling=Sync'] + if optimizations: + cmd += get_build_optimizations() + get_memory_optimizations() + + if not capture_output: + color = Colors.BRIGHT_YELLOW + print(f"\n{color}{'='*60}{Colors.RESET}") + label = f"[{counter}] " if counter else "" + print(f"{color}Building {Colors.BRIGHT_WHITE}{config.name:15s}{Colors.RESET} {color}{label}({'rebuild' if rebuild else 'incremental'}){Colors.RESET}") + print(f"{color}{'='*60}{Colors.RESET}") + + start = time.time() + try: + if capture_output: + result = subprocess.run(cmd, check=False, capture_output=True, text=True) + return result.returncode == 0, time.time() - start, result.stdout + result.stderr + else: + result = subprocess.run(cmd, check=False) + return result.returncode == 0, time.time() - start, "" + except Exception as e: + elapsed = time.time() - start + msg = f"ERROR: Build failed with exception: {e}" + if capture_output: + return False, elapsed, msg + print(msg) + return False, elapsed, "" + + +def copy_output(project_dir: Path, dist_dir: Path, config: BuildConfig) -> Tuple[bool, int, Optional[Path]]: + output_file = project_dir / 'Build' / config.name / DLL_NAME + if not output_file.exists(): + print(f"ERROR: DLL not found: {output_file}") + return False, 0, None + dest = dist_dir / config.dest_dir + dest.mkdir(parents=True, exist_ok=True) + try: + dst = dest / DLL_NAME + shutil.copy2(output_file, dst) + return True, output_file.stat().st_size, dst + except Exception as e: + print(f"ERROR: Failed to copy {config.name}: {e}") + return False, 0, None + + +def copy_to_plugins(dist_dir: Path, config: BuildConfig, plugins_dir: Path) -> Optional[Path]: + """Copy DLL from dist// to plugins//.""" + src = dist_dir / config.dest_dir / DLL_NAME + if not src.exists(): + return None + dst_dir = plugins_dir / config.dest_dir + dst_dir.mkdir(parents=True, exist_ok=True) + dst = dst_dir / DLL_NAME + shutil.copy2(src, dst) + return dst + + +def clean_build_artifacts(project_dir: Path, configs: List[BuildConfig]) -> None: + print(f"\n{Colors.CYAN}Cleaning build artifacts...{Colors.RESET}") + build_base = project_dir / 'Build' + if not build_base.exists(): + return + for cfg in configs: + d = build_base / cfg.name + if d.exists(): + try: + robust_rmtree(d) + print(f" {Colors.GRAY}- Cleaned:{Colors.RESET} {cfg.name}") + except Exception as e: + print(f" {Colors.RED}- Failed to clean {cfg.name}: {e}{Colors.RESET}") + try: + if build_base.exists() and not any(build_base.iterdir()): + build_base.rmdir() + except Exception: + pass + print(f"{Colors.BRIGHT_GREEN}Build artifacts cleaned successfully.{Colors.RESET}") + + +def print_available_configurations(project_file: Path) -> None: + try: + tree = ET.parse(project_file) + root = tree.getroot() + ns = {'ms': 'http://schemas.microsoft.com/developer/msbuild/2003'} + configs = [] + for ig in root.findall('.//ms:ItemGroup', ns): + for pc in ig.findall('ms:ProjectConfiguration', ns): + inc = pc.get('Include', '') + parts = inc.split('|') + if len(parts) == 2: + configs.append(tuple(parts)) + print("Available configurations in project:") + print("-" * 60) + from collections import defaultdict + grouped: dict = defaultdict(list) + for cfg, plat in configs: + grouped[cfg].append(plat) + for cfg_name in sorted(grouped): + print(f" {cfg_name:25s} - {', '.join(sorted(grouped[cfg_name]))}") + print(f"\nTotal: {len(configs)} configuration(s)\n") + except Exception as e: + print(f"Could not parse project file: {e}") + + +_print_lock = threading.Lock() + + +def _build_configs_parallel( + msbuild_path: Path, + project_file: Path, + configs: List[BuildConfig], + platform_toolset: str, + *, + rebuild: bool, + verbosity: str, + parallel: bool, + optimizations: bool, + project_dir: Path, + dist_dir: Path, +) -> list: + n = len(configs) + print(f"\nParallel: launching {n} builds simultaneously...") + print("=" * 50) + total_start = time.time() + results_by_idx: dict = {} + idx_lock = threading.Lock() + + def _build_one(idx: int, config: BuildConfig): + import contextlib + import io as _io + success, build_time, captured = build_configuration( + msbuild_path, project_file, config, platform_toolset, + rebuild=rebuild, verbosity=verbosity, + parallel=parallel, optimizations=optimizations, + capture_output=True, + ) + copy_buf = _io.StringIO() + if success: + with contextlib.redirect_stdout(copy_buf): + copy_ok, file_size, dest_path = copy_output(project_dir, dist_dir, config) + else: + copy_ok, file_size, dest_path = False, 0, None + + with _print_lock: + sys.stdout.write("\r" + " " * 80 + "\r") + sys.stdout.flush() + tag = "OK" if (success and copy_ok) else "FAILED" + size_str = f"{file_size:,} bytes" if file_size > 0 else "N/A" + copy_out = copy_buf.getvalue() + if copy_out.strip(): + print(copy_out.rstrip()) + if captured.strip(): + lines = [ln for ln in captured.splitlines() if "MSBuild" not in ln and "Copyright" not in ln] + filtered = "\n".join(lines).strip() + if filtered: + print(filtered) + color = Colors.BRIGHT_GREEN if (success and copy_ok) else Colors.RED + print(f"{color}[{tag}]{Colors.RESET} {config.name} ({format_time(build_time)}) {size_str}") + if dest_path: + print(f" -> {dest_path}") + + with idx_lock: + results_by_idx[idx] = (config, success and copy_ok, build_time, file_size, dest_path) + + with Spinner("Building configurations...", total=n) as s: + with ThreadPoolExecutor(max_workers=n) as executor: + futures = {executor.submit(_build_one, i, cfg): i for i, cfg in enumerate(configs)} + for fut in as_completed(futures): + s.update() + exc = fut.exception() + if exc: + idx = futures[fut] + with _print_lock: + print(f"ERROR: worker for config index {idx} raised: {exc}") + with idx_lock: + results_by_idx[idx] = (configs[idx], False, 0.0, 0, None) + + wall = time.time() - total_start + print(f"\nAll {n} configs finished in {format_time(wall)} (wall clock)") + return [results_by_idx[i] for i in range(n)] + + +# --------------------------------------------------------------------------- +# main +# --------------------------------------------------------------------------- + +def main() -> int: + parser = argparse.ArgumentParser(description='Build NewAdvSplash plugin for NSIS') + parser.add_argument('--configs', nargs='+', + choices=list(CONFIGS.keys()) + ['all'], default=None) + parser.add_argument('--config', # singular alias used by CI + choices=list(CONFIGS.keys()) + ['all'], default=None) + parser.add_argument('--rebuild', action='store_true', default=True) + parser.add_argument('--no-rebuild', action='store_false', dest='rebuild') + parser.add_argument('--parallel', action='store_true', default=True) + parser.add_argument('--no-parallel', action='store_false', dest='parallel') + parser.add_argument('--verbosity', + choices=['quiet', 'minimal', 'normal', 'detailed', 'diagnostic'], + default='quiet') + parser.add_argument('--clean', action='store_true', default=False) + parser.add_argument('--list', action='store_true') + parser.add_argument('--list-project', action='store_true') + parser.add_argument('--no-optimizations', action='store_true') + parser.add_argument('--vs-version', choices=['auto', '2026', '2022'], default='auto') + parser.add_argument('--final', action='store_true', default=False, + help='Force rebuild + clean (pre-release build)') + parser.add_argument('--install-dir', type=Path, default=None, + help='Copy built DLLs to this directory (in / subdirs)') + args = parser.parse_args() + + # Merge --config (singular) into --configs list + if args.config and not args.configs: + args.configs = [args.config] + + if args.final: + args.rebuild = True + args.clean = True + + project_dir, project_file, dist_dir = get_project_paths() + + if args.list_project: + print_available_configurations(project_file) + return 0 + + if args.list: + for name, config in CONFIGS.items(): + print(f" {name:15s} -> {config.config} / {config.platform}") + return 0 + + if not project_file.exists(): + print(f"ERROR: project file not found: {project_file}", file=sys.stderr) + return 3 + + msbuild_result = find_msbuild(args.vs_version) + if not msbuild_result: + print("ERROR: MSBuild not found. Install Visual Studio 2022 or 2026.", file=sys.stderr) + return 2 + msbuild_path, platform_toolset, vs_version_name = msbuild_result + + version = read_version() + + if not args.configs: + configs_to_build = list(CONFIGS.values()) + elif 'all' in args.configs: + configs_to_build = list(CONFIGS.values()) + else: + configs_to_build = [CONFIGS[n] for n in args.configs] + + # Banner + print(f"{Colors.BOLD}{Colors.BRIGHT_CYAN}{'='*60}") + print(f"Building NewAdvSplash plugin v{version} - {Colors.BRIGHT_WHITE}{len(configs_to_build)}{Colors.RESET} {Colors.BOLD}{Colors.BRIGHT_CYAN}configuration(s)") + print(f"{'='*60}{Colors.RESET}") + print(f"{Colors.CYAN}VS: {Colors.RESET} {Colors.BRIGHT_WHITE}{vs_version_name}{Colors.RESET} {Colors.GRAY}({platform_toolset}){Colors.RESET}") + print(f"{Colors.CYAN}MSBuild: {Colors.RESET} {Colors.BRIGHT_WHITE}{msbuild_path}{Colors.RESET}") + print(f"{Colors.CYAN}Project: {Colors.RESET} {Colors.BRIGHT_WHITE}{project_file}{Colors.RESET}") + print(f"{Colors.CYAN}Dist: {Colors.RESET} {Colors.BRIGHT_WHITE}{dist_dir}{Colors.RESET}") + print(f"{Colors.CYAN}Rebuild: {Colors.RESET} {Colors.BRIGHT_WHITE}{args.rebuild}{Colors.RESET}") + print(f"{Colors.CYAN}Verbosity: {Colors.RESET} {Colors.BRIGHT_WHITE}{args.verbosity}{Colors.RESET}") + print() + + use_optimizations = not args.no_optimizations + print_cpu_info(args.parallel, use_optimizations) + + build_results = [] + total_start = time.time() + + if args.parallel and len(configs_to_build) > 1: + build_results = _build_configs_parallel( + msbuild_path, project_file, configs_to_build, platform_toolset, + rebuild=args.rebuild, verbosity=args.verbosity, + parallel=True, optimizations=use_optimizations, + project_dir=project_dir, dist_dir=dist_dir, + ) + else: + for i, config in enumerate(configs_to_build, 1): + success, b_time, _ = build_configuration( + msbuild_path, project_file, config, platform_toolset, + rebuild=args.rebuild, verbosity=args.verbosity, + parallel=args.parallel, optimizations=use_optimizations, + counter=f"{i}/{len(configs_to_build)}", + ) + if success: + ok, size, path = copy_output(project_dir, dist_dir, config) + build_results.append((config, ok, b_time, size, path)) + else: + build_results.append((config, False, b_time, 0, None)) + + total_time = time.time() - total_start + all_success = all(res[1] for res in build_results) + + print(f"\n{Colors.BOLD}{Colors.BRIGHT_GREEN if all_success else Colors.RED}{'='*50}") + print("ALL BUILDS SUCCESSFUL!" if all_success else "SOME BUILDS FAILED!") + print(f"{'='*50}{Colors.RESET}") + + # Copy to workspace plugins/ dir if present + plugins_dir = get_plugins_dir() + plugins_copied = [] + if plugins_dir and all_success: + for cfg, ok, _, _, _ in build_results: + if ok: + dst = copy_to_plugins(dist_dir, cfg, plugins_dir) + if dst: + plugins_copied.append(str(dst)) + if plugins_copied: + print(f"\n{Colors.CYAN}Installed to plugins/:{Colors.RESET}") + for p in plugins_copied: + print(f" {Colors.GRAY}->{Colors.RESET} {p}") + + if args.install_dir and all_success: + print(f"\n{Colors.CYAN}Installing to {args.install_dir}...{Colors.RESET}") + for cfg, ok, _, _, path in build_results: + if ok and path: + dest = args.install_dir / cfg.dest_dir + dest.mkdir(parents=True, exist_ok=True) + shutil.copy2(path, dest / DLL_NAME) + print(f" {Colors.GRAY}- Installed:{Colors.RESET} {dest / DLL_NAME}") + + print(f"\n{Colors.BOLD}{Colors.BRIGHT_CYAN}{'-'*50}") + print(f"Build Summary - VS {vs_version_name} ({platform_toolset}):") + for cfg, ok, b_time, size, _ in build_results: + color = Colors.GREEN if ok else Colors.RED + tag = "OK " if ok else "FAIL" + print(f" {color}{tag}{Colors.RESET} {cfg.name:15s} - {format_time(b_time):8s} - {size:11,d} bytes") + print(f"{Colors.BOLD}{Colors.BRIGHT_CYAN}{'-'*50}{Colors.RESET}") + print(f"Total time: {format_time(total_time)}\n") + + if args.clean: + clean_build_artifacts(project_dir, configs_to_build) + + return 0 if all_success else 1 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/dist/amd64-unicode/newadvsplash.dll b/dist/amd64-unicode/newadvsplash.dll new file mode 100644 index 0000000000000000000000000000000000000000..d3b534a8779294ee9eea2ace90f8652a0ae167a3 GIT binary patch literal 120832 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%0DH;^BWds?3~~5?LURx|FJ^PD+bZ5$n%Op%>Nim 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 literal 0 HcmV?d00001 diff --git a/dist/x86-unicode/newadvsplash.dll b/dist/x86-unicode/newadvsplash.dll new file mode 100644 index 0000000000000000000000000000000000000000..f0ed47e07d5ae8423daaf300321e17ab3e238146 GIT binary patch literal 99328 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 E51sJadjJ3c literal 0 HcmV?d00001 diff --git a/docs/legacy-vc6/advsplash.dsp b/docs/legacy-vc6/advsplash.dsp new file mode 100644 index 0000000..e61e7ea --- /dev/null +++ b/docs/legacy-vc6/advsplash.dsp @@ -0,0 +1,177 @@ +# Microsoft Developer Studio Project File - Name="advsplash" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=advsplash - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "advsplash.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "advsplash.mak" CFG="advsplash - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "advsplash - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "advsplash - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "advsplash - Win32 Release_Unicode" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "advsplash - Win32 Debug_Unicode" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "advsplash - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /Og /Os /Oy /I "..\ExDll" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /FD /c +# SUBTRACT CPP /Ox /Ow /YX +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib vfw32.lib winmm.lib ole32.lib oleaut32.lib uuid.lib msvcrt.lib /nologo /entry:"DllMain" /subsystem:windows /dll /machine:I386 /nodefaultlib /out:"../../Plugins/newadvsplash.dll" /opt:nowin98 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "advsplash - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\ExDll" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib vfw32.lib winmm.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"../../Plugins/newadvsplash.dll" /pdbtype:sept +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "advsplash - Win32 Release_Unicode" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release_Unicode" +# PROP BASE Intermediate_Dir "Release_Unicode" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release_Unicode" +# PROP Intermediate_Dir "Release_Unicode" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /Og /Os /Oy /I "..\ExDll" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /D "_MBCS" /D "_USRDLL" /FD /c +# SUBTRACT CPP /Ox /Ow /YX +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib vfw32.lib winmm.lib ole32.lib oleaut32.lib uuid.lib msvcrt.lib /nologo /entry:"DllMain" /subsystem:windows /dll /machine:I386 /nodefaultlib /out:"../../Unicode/plugins/newadvsplash.dll" /opt:nowin98 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "advsplash - Win32 Debug_Unicode" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_UNICODE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\ExDll" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /D "_MBCS" /D "_USRDLL" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib vfw32.lib winmm.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"../../Unicode/plugins/newadvsplash.dll" /pdbtype:sept +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "advsplash - Win32 Release" +# Name "advsplash - Win32 Debug" +# Name "advsplash - Win32 Release_Unicode" +# Name "advsplash - Win32 Debug_Unicode" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\advsplash.cpp +# End Source File +# Begin Source File + +SOURCE=.\gif.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\ExDLL\exdll.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/docs/legacy-vc6/advsplash.dsw b/docs/legacy-vc6/advsplash.dsw new file mode 100644 index 0000000..03ad954 --- /dev/null +++ b/docs/legacy-vc6/advsplash.dsw @@ -0,0 +1,28 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "advsplash"=.\advsplash.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### \ No newline at end of file diff --git a/docs/original-readme.txt b/docs/original-readme.txt new file mode 100644 index 0000000..248077d --- /dev/null +++ b/docs/original-readme.txt @@ -0,0 +1,69 @@ +NewAdvSplash.dll - plug-in that lets you throw +up a splash screen in NSIS installers with +fading effects (win2k/xp) and transparency. +At the same time can play wav-mp3 sound file. + +Usage: + +1) newadvsplash::show [/NOUNLOAD] Delay FadeIn FadeOut KeyColor [/BANNER] [/PASSIVE] [/NOCANCEL] FileName + +Delay - time (milliseconds) to show image +FadeIn - time to show the fadein scene +FadeOut - time to show the fadeout scene +KeyColor - color used for transparency, could be any RGB value + (for ex. R=255 G=100 B=16 -> KeyColor=0xFF6410), + use KeyColor=-1 if there is no transparent color at your image. + If KeyColor=-2 and image type is gif, plug-in attempts to extract + transparency color value from the file header. For gif images + transparency on the static background works even if KeyColor=-1. +/BANNER - returns control to installer immediatelly after plug-in + activation. Not depends on installer page - parent window NULL. +/NOCANCEL - disables 'exit on user click' default behaviour. +/PASSIVE - not forces splash window to foreground. +FileName - splash image filename (with extension!). Bmp, gif and jpg + image types are supported. + +For example: + + newadvsplash::show 3000 0 0 -2 "$PLUGINSDIR\catch.gif" +or + newadvsplash::show /NOUNLOAD 1000 600 400 0xFF6410 /BANNER "$TEMP\spltmp.bmp" + + Use /NOUNLOAD with /BANNER key - this case plug-in not waits for + the end of 'show' and returns control to installer. If used in .onInit + function, /BANNER key requires 'ShowWindow $HWNDPARENT 2' in .onGUIInit + + +2) newadvsplash::stop [/WAIT | /FADEOUT] + + Without options terminates banner. + With /WAIT option waits for the end. + With /FADEOUT option forces banner close with fade out effect ('Delay' -> 0). + + +3) newadvsplash::play /NOUNLOAD [/LOOP] FileName + +FileName - sound filename to play (with extension, wav, mp3 ...). +Empty Filename string "" stops sound. +For example: + + newadvsplash::play /NOUNLOAD /LOOP "$PLUGINSDIR\snd.mp3" + newadvsplash::show 2000 1000 500 -1 "$PLUGINSDIR\iamfat.jpg" + + +4) newadvsplash::hwnd /NOUNLOAD + +Gets splash window handle. +For example: + + newadvsplash::hwnd /NOUNLOAD + Pop $0 ; $0 is window handle now + +Compatibility: +Basic - Win95 and later. +Fadein/fadeout - win2k/winxp. + +Original code - Justin +Converted to a plugin DLL by Amir Szekely (kichik) +Fading and transparency by Nik Medved (brainsucker) +Gif and jpeg support, /BANNER and /CANCEL, mp3 support - Takhir Bedertdinov diff --git a/docs/wiki.txt b/docs/wiki.txt new file mode 100644 index 0000000..9b7d98f --- /dev/null +++ b/docs/wiki.txt @@ -0,0 +1,82 @@ +{{PageAuthor|Takhir}} + +== Links == +Download:
+NewAdvSplash.zip
+[http://forums.winamp.com/showthread.php?s=&threadid=197479 Forum thread] + +== Description == + +NewAdvSplash.dll - startup image banner plug-in with fading effects (win2k/xp) and transparency. At the same time can play sound file. On the base of AdvSplash NSIS plug-in with following add-ons: allows background installer initialization (async-banner mode); plays mp3 files; gif, jpeg and some other OleLoadPicture() formats; "passive" mode - not forces spalsh window to foreground; can return splash HWND to work with other plug-ins (Marquee, AnimGif) in the async mode. +Compatibility: basic - Win95 and later, fadein/fadeout - win2k/winxp. + +== Installing == + +Unzip and place the .dll file into the Plugins directory. + +== Entry points and parameters (NSIS script) == + + newadvsplash::show [/NOUNLOAD] Delay FadeIn FadeOut KeyColor [/BANNER] [/PASSIVE] [/NOCANCEL] FileName + +; Delay +: time (milliseconds) to show image + +; FadeIn +: time to show the fadein scene + +; FadeOut +: time to show the fadeout scene + +; KeyColor +: color used for transparency, could be any RGB value (for ex. R=255 G=100 B=16 -> KeyColor=0xFF6410), use KeyColor=-1 if there is no transparent color at your image. If KeyColor=-2 and image type is gif, plug-in attempts to extract transparency color value from the file header. For gif images transparency on the static background works even if KeyColor=-1. + +; /BANNER +: returns control to installer immediatelly after plug-in activation. + +; /NOCANCEL +: disables 'exit on user click' default behaviour. + +; /PASSIVE +: not forces spalsh window to foreground + +; FileName +: splash image filename (with extension!). Bmp, gif and jpg image types supported. + + + newadvsplash::stop [/WAIT | /FADEOUT] + +: For /BANNER mode only! Without options terminates banner. +: With /WAIT option waits for the end. +: With /FADEOUT option forces banner close with fade out effect ('Delay' -> 0). + + + newadvsplash::play /NOUNLOAD [/LOOP] FileName + +; FileName +: sound filename to play (with extension, wav, mp3 ...). Empty Filename string "" stops playing ('show' end does this as well). + +; /LOOP +: loops sound. + + + newadvsplash::hwnd + +: Gets splash window handle (use Pop to take it from stack) + +== Examples == +'Modeless' logo with sound + + newadvsplash::play /NOUNLOAD /LOOP "$PLUGINSDIR\snd.mp3" + newadvsplash::show /NOUNLOAD 2000 1000 500 -2 /BANNER "$PLUGINSDIR\logo.gif" + ; add your initialization code here + newadvsplash::stop /WAIT + + +Simple logo + + newadvsplash::show 2000 1000 500 -1 "$PLUGINSDIR\logo.jpg" + + +No return value. + +[[Category:Plugins]] diff --git a/examples/aist.gif b/examples/aist.gif new file mode 100644 index 0000000000000000000000000000000000000000..06ded06c5b09a1f5f4b2b871aa5ecf2b39610b1a GIT binary patch literal 8494 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 + + + + Release + Win32 + + + Release Unicode + Win32 + + + Release + x64 + + + Release Unicode + x64 + + + + 17.0 + {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942} + Win32Proj + NewAdvSplash + 10.0 + + + + DynamicLibrary + false + v143 + true + MultiByte + + + DynamicLibrary + false + v143 + true + Unicode + + + DynamicLibrary + false + v143 + true + MultiByte + + + DynamicLibrary + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + Level3 + true + true + false + + WIN32;NDEBUG;_WINDOWS;_USRDLL;EXDLL_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + MultiThreaded + MaxSpeed + + + Windows + true + true + false + + kernel32.lib;user32.lib;gdi32.lib;ole32.lib;vfw32.lib;winmm.lib;%(AdditionalDependencies) + + + + + + + Level3 + true + true + false + + WIN32;NDEBUG;_WINDOWS;_USRDLL;EXDLL_EXPORTS;UNICODE;_UNICODE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + MultiThreaded + MaxSpeed + + + Windows + true + true + false + + kernel32.lib;user32.lib;gdi32.lib;ole32.lib;vfw32.lib;winmm.lib;%(AdditionalDependencies) + + + + + + + Level3 + true + true + false + + NDEBUG;_WINDOWS;_USRDLL;EXDLL_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + MultiThreaded + MaxSpeed + + + Windows + true + true + false + + kernel32.lib;user32.lib;gdi32.lib;ole32.lib;vfw32.lib;winmm.lib;%(AdditionalDependencies) + + + + + + + Level3 + true + true + false + + NDEBUG;_WINDOWS;_USRDLL;EXDLL_EXPORTS;UNICODE;_UNICODE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + true + MultiThreaded + MaxSpeed + + + Windows + true + true + false + + kernel32.lib;user32.lib;gdi32.lib;ole32.lib;vfw32.lib;winmm.lib;%(AdditionalDependencies) + + + + + + + + + + + + \ No newline at end of file diff --git a/src/advsplash.cpp b/src/advsplash.cpp new file mode 100644 index 0000000..06fa556 --- /dev/null +++ b/src/advsplash.cpp @@ -0,0 +1,539 @@ +/*************************************************** + * FILE NAME: advsplash.cpp + * + * Copyright 2003 - Present NSIS + * + * PURPOSE: + * Splash screen in NSIS installers with fading + * and transparency effects + * + * CHANGE HISTORY + * + * Author Date Modifications + * + * Justin Original + * Amir Szekely (kichik) Converted to a plugin DLL + * Nik Medved (brainsucker) Fading and transparency by + * Takhir Bedertdinov + * 10-26-2004 Gif and jpeg support + * 06-25-2005 modeless mode + * 08-30-2005 hwnd entry point for AnimGif + * 10-16-2005 "no transparency" bug for white bg images fixed + * 03-04-2006 /PASSIVE mode + * 04-04-2006 NULL parent HWND for /BANNER mode + * hbatista + * 04-05-2007 Unregister window on 'stop' + * Takhir + * 11-20-2007 "stop /fadeout" option - decreases sleep time + * "stop /wait" fully replaces ::wait call + **************************************************/ + +// For layered windows +#define _WIN32_WINNT 0x0500 + +#include +#include +#include +#include +#include +#include +#include "exdll.h" + +#ifndef WS_EX_LAYERED +#define WS_EX_LAYERED 0x00080000 +#define LWA_COLORKEY 0x00000001 +#define LWA_ALPHA 0x00000002 +#endif // ndef WS_EX_LAYERED + +#define RESOLUTION 32 // 32 ms ~ 30 fps ;) (32? I like SHR more than iDIV ;) +#define MAX_SHOW_TIME 60000 + +enum FADE_STATES +{ + FADE_IN, + FADE_SLEEP, + FADE_OUT +}; + +const TCHAR classname[4] = _T("_sp"); +HWND myWnd = NULL; +HINSTANCE g_hInstance; +HANDLE hThread = NULL; +BITMAP bm; +HBITMAP g_hbm; +int resolution = RESOLUTION; +int sleep_val, fadein_val, fadeout_val, state, timeleft, keycolor, alphaparam; +LPPICTURE pIPicture = NULL; +bool modal = true, nocancel = false, setfg = true; +UINT timerEvent; +static WNDCLASS wc; + +typedef BOOL(_stdcall *_tSetLayeredWindowAttributesProc)(HWND hwnd, // handle to the layered window + COLORREF crKey, // specifies the color key + BYTE bAlpha, // value for the blend function + DWORD dwFlags // action +); +_tSetLayeredWindowAttributesProc SetLayeredWindowAttributesProc; + +int getTransparencyColor(TCHAR *fn_src); + +void sf(HWND hw) +{ + DWORD ctid = GetCurrentThreadId(); + DWORD ftid = GetWindowThreadProcessId(GetForegroundWindow(), NULL); + AttachThreadInput(ftid, ctid, TRUE); + SetForegroundWindow(hw); + AttachThreadInput(ftid, ctid, FALSE); +} + +/***************************************************** + * FUNCTION NAME: WndProc() + * PURPOSE: + * window proc. + * SPECIAL CONSIDERATIONS: + * for paint purposes mainly + *****************************************************/ +static LRESULT CALLBACK WndProc(HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + PAINTSTRUCT ps; + RECT r; + long w, h; + + switch (uMsg) + { + case WM_CREATE: + SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0); + SetWindowLong(hwnd, GWL_STYLE, 0); + SetWindowPos(hwnd, NULL, + r.left + (r.right - r.left - bm.bmWidth) / 2, + r.top + (r.bottom - r.top - bm.bmHeight) / 2, + bm.bmWidth, bm.bmHeight, + SWP_NOZORDER | SWP_SHOWWINDOW); + return 0; + + case WM_PAINT: + BeginPaint(hwnd, &ps); + if (pIPicture != NULL) + { + GetClientRect(hwnd, &r); + pIPicture->get_Width(&w); + pIPicture->get_Height(&h); + pIPicture->Render(ps.hdc, r.left, + r.top, r.right - r.left, r.bottom - r.top, 0, h, w, -h, &r); + } + EndPaint(hwnd, &ps); + + case WM_CLOSE: + return 0; + + case WM_LBUTTONDOWN: + if (nocancel) + break; + case WM_TIMER: + timeKillEvent(timerEvent); + if (setfg) + sf(hwnd); + PlaySound(0, 0, 0); + DestroyWindow(hwnd); + break; + } + return DefWindowProc(hwnd, uMsg, wParam, lParam); +} + +/***************************************************** + * FUNCTION NAME: SetTransparentRegion() + * PURPOSE: + * creates window region + * SPECIAL CONSIDERATIONS: + * kind of skin creation from bmp + *****************************************************/ +void SetTransparentRegion(HWND myWnd) +{ + HDC dc; + int x, y; + HRGN region, cutrgn; + BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER), bm.bmWidth, bm.bmHeight, 1, 32, BI_RGB, 0, 0, 0, 0, 0}}; + int size = bm.bmWidth * bm.bmHeight * 4; + int *pbmp = (int *)GlobalAlloc(GPTR, size), + *bmp; + + bmp = pbmp; + dc = CreateCompatibleDC(NULL); + SelectObject(dc, g_hbm); + + x = GetDIBits(dc, g_hbm, 0, bm.bmHeight, bmp, &bmi, DIB_RGB_COLORS); + region = CreateRectRgn(0, 0, bm.bmWidth, bm.bmHeight); + + // Search for transparent pixels + for (y = bm.bmHeight - 1; y >= 0; y--) + for (x = 0; x < bm.bmWidth;) + if ((*bmp & 0xFFFFFF) == keycolor) + { + int j = x; + while ((x < bm.bmWidth) && ((*bmp & 0xFFFFFF) == keycolor)) + bmp++, x++; + + // Cut transparent pixels from the original region + cutrgn = CreateRectRgn(j, y, x, y + 1); + CombineRgn(region, region, cutrgn, RGN_XOR); + DeleteObject(cutrgn); + } + else + bmp++, x++; + + // Set resulting region. + SetWindowRgn(myWnd, region, TRUE); + DeleteObject(region); + DeleteObject(dc); + GlobalFree(pbmp); +} + +/***************************************************** + * FUNCTION NAME: TimeProc() + * PURPOSE: + * fade in/out tracking + * SPECIAL CONSIDERATIONS: + * works without WM_TIMER + *****************************************************/ +void CALLBACK TimeProc(UINT uID, + UINT uMsg, + DWORD_PTR dwUser, + DWORD_PTR dw1, + DWORD_PTR dw2) +{ + int call = -1; + + switch (state) + { + case FADE_IN: + if (timeleft == 0) + { + timeleft = sleep_val; + state++; + if (SetLayeredWindowAttributesProc != NULL) + call = 255; + } + else + { + call = ((fadein_val - timeleft) * 255) / fadein_val; + break; + } + case FADE_SLEEP: + if (timeleft == 0) + { + timeleft = fadeout_val; + state++; + } + else + break; + case FADE_OUT: + if (timeleft == 0) + { + PostMessage((HWND)dwUser, WM_TIMER, 0, 0); + return; + } + else + { + call = ((timeleft) * 255) / fadeout_val; + break; + } + } + // Transparency value aquired, and could be set... + if ((call >= 0) && SetLayeredWindowAttributesProc != NULL) + SetLayeredWindowAttributesProc((HWND)dwUser, keycolor, + call, + alphaparam); + // Time is running out... + timeleft--; +} + +/***************************************************** + * FUNCTION NAME: play() + * PURPOSE: + * PlaySound dll entry point + * SPECIAL CONSIDERATIONS: + * makes PlaySound working on Win98 + * works with /NOUNLOAD parameter only + * wav files are huge :-( + * but not flushes on the screen like mci window does + * Use it BEFORE 'show' call + *****************************************************/ +extern "C" void __declspec(dllexport) play(HWND hwndParent, + int string_size, + TCHAR *variables, + stack_t **stacktop) +{ + TCHAR fn[MAX_PATH]; + DWORD snd = SND_FILENAME | SND_ASYNC | SND_NODEFAULT; + EXDLL_INIT(); + if (popstring(fn) == 0) + { + if (lstrcmpi(fn, _T("/loop")) == 0) + { + snd |= SND_LOOP; + *fn = 0; + popstring(fn); + } + if (*fn == 0) + { + PlaySound(NULL, NULL, 0); + } + else + { + PlaySound(fn, NULL, snd); + } + } +} + +/***************************************************** + * FUNCTION NAME: splashThread() + * PURPOSE: + * modal/modeless banner presentation + * SPECIAL CONSIDERATIONS: + * from CreateThread runs window "detached", with NULL + * parent, otherwise uses current page as parent + *****************************************************/ +DWORD WINAPI splashThread(LPVOID lpParameter) +{ + MSG msg; + HWND hParent = (HWND)lpParameter; + wc.lpfnWndProc = WndProc; + wc.hInstance = g_hInstance; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.lpszClassName = classname; + + if (RegisterClass(&wc)) + { + pIPicture->get_Handle((OLE_HANDLE *)&g_hbm); + GetObject((HGDIOBJ)g_hbm, sizeof(BITMAP), &bm); + + myWnd = CreateWindowEx(WS_EX_TOOLWINDOW | (setfg ? WS_EX_TOPMOST : 0) | + (SetLayeredWindowAttributesProc != NULL ? WS_EX_LAYERED : 0), + classname, classname, 0, 0, 0, 0, 0, + hParent, NULL, g_hInstance, NULL); + // Set transparency / key color + if (SetLayeredWindowAttributesProc != NULL) + SetLayeredWindowAttributesProc(myWnd, keycolor, + fadein_val > 0 ? 0 : 255, + alphaparam); + if (keycolor != -1) + SetTransparentRegion(myWnd); + + // Start up timer... + state = FADE_IN; + timeleft = fadein_val; + timerEvent = timeSetEvent(resolution, RESOLUTION / 4, TimeProc, + (DWORD_PTR)myWnd, TIME_PERIODIC); + + while (IsWindow(myWnd) && GetMessage(&msg, myWnd, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + pIPicture->Release(); + pIPicture = NULL; // do not re-use with /NOUNLOAD + } + + myWnd = NULL; + // Stop currently playing wave, we want to exit + PlaySound(0, 0, 0); + + return 0; +} + +/***************************************************** + * FUNCTION NAME: show() + * PURPOSE: + * image banner "show" dll entry point + * SPECIAL CONSIDERATIONS: + * + *****************************************************/ +extern "C" void __declspec(dllexport) show(HWND hwndParent, + int string_size, + TCHAR *variables, + stack_t **stacktop) +{ + DEVMODE dm; + TCHAR fn[MAX_PATH]; + WCHAR wcPort[MAX_PATH]; + DWORD dwThreadId; + DWORD dwMainThreadId = GetCurrentThreadId(); + + EXDLL_INIT(); + + // 3 fade parameters and keycolor from stack come first + popstring(fn); + sleep_val = _tcstol(fn, NULL, 0); + popstring(fn); + fadein_val = _tcstol(fn, NULL, 0); + popstring(fn); + fadeout_val = _tcstol(fn, NULL, 0); + popstring(fn); + keycolor = _tcstol(fn, NULL, 0); + + // other parameters (if any) + filename + while (!popstring(fn) && fn[0] == _T('/')) + { + if (lstrcmpi(fn, _T("/nocancel")) == 0) + nocancel = true; + else if (lstrcmpi(fn, _T("/passive")) == 0) + setfg = false; + else + modal = false; + } + + if (keycolor == -2) + keycolor = getTransparencyColor(fn); + + // Check for winXP/2k at 32 bpp transparency support + dm.dmSize = sizeof(DEVMODE); + EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm); + if (dm.dmBitsPerPel >= 32) + { + HANDLE user32 = GetModuleHandle(_T("user32")); + SetLayeredWindowAttributesProc = (_tSetLayeredWindowAttributesProc) + GetProcAddress((HINSTANCE)user32, "SetLayeredWindowAttributes"); + } + + if (SetLayeredWindowAttributesProc == NULL) + { + // Fading+transparency is unsupported at old windows versions... + resolution = (sleep_val + fadein_val + fadeout_val) / 2; + fadeout_val = fadein_val = 0; + sleep_val = 1; + } + else + { + // div them by resolution - now times are in 32 ms "frames" + sleep_val >>= 5; + fadein_val >>= 5; + fadeout_val >>= 5; + // MS RGB - BGR format + alphaparam = LWA_ALPHA | (keycolor == -1 ? 0 : LWA_COLORKEY); + if (keycolor != -1) + keycolor = ((keycolor & 0xFF) << 16) + (keycolor & 0xFF00) + + ((keycolor & 0xFF0000) >> 16); + } + +// who wrote this script :-)) +#ifdef _UNICODE + lstrcpy(wcPort, fn); +#else + MultiByteToWideChar(CP_ACP, 0, fn, -1, wcPort, sizeof(wcPort) / 2); +#endif + OleLoadPicturePath((LPOLESTR)wcPort, 0, 0, 0, IID_IPicture, (void **)&pIPicture); + if (pIPicture == NULL || + (sleep_val + fadein_val + fadeout_val) <= 0) + return; + + if (modal) + { + splashThread((void *)hwndParent); + // We should UnRegister class, since Windows NT series never does this by itself + UnregisterClass(wc.lpszClassName, g_hInstance); + } + else + { + // start thread and wait for window initialization + hThread = CreateThread(0, 0, splashThread, NULL, 0, &dwThreadId); + while (myWnd == NULL || !IsWindowVisible(myWnd)) + Sleep(10); + if (setfg) + sf(myWnd); + } +} + +/***************************************************** + * FUNCTION NAME: stop() + * PURPOSE: + * image banner "stop" dll entry point + * SPECIAL CONSIDERATIONS: + * + *****************************************************/ +extern "C" void __declspec(dllexport) stop(HWND hwndParent, + int string_size, + TCHAR *variables, + stack_t **stacktop) +{ + TCHAR cmd[64]; + if (!modal && hThread != NULL) + { + if (popstring(cmd) == 0) + { + if (lstrcmpi(cmd, _T("/fadeout")) == 0) + { + if (SetLayeredWindowAttributesProc == NULL) + stop(hwndParent, string_size, variables, stacktop); + else + { + if (state == FADE_IN) + { + sleep_val = 1; // minimize sleep step - 1 frame only + } + else if (state == FADE_SLEEP) + { + timeleft = 1; // force sleep to finish + } + WaitForSingleObject(hThread, (fadein_val + fadeout_val + 3) * resolution); + } + } + if (lstrcmpi(cmd, _T("/wait")) == 0) + { + WaitForSingleObject(hThread, + resolution * (SetLayeredWindowAttributesProc == NULL ? 2 : fadein_val + fadeout_val + sleep_val + 3)); + } + else + pushstring(cmd); // this is not our string + } + if (IsWindow(myWnd)) + { + SendMessage(myWnd, WM_TIMER, 0, 0); // stops sound and destroys window + } + WaitForSingleObject(hThread, 1000); + CloseHandle(hThread); + hThread = NULL; + + // hbatista + UnregisterClass(wc.lpszClassName, g_hInstance); + Sleep(10); + if (setfg) + sf(hwndParent); + } +} + +/***************************************************** + * FUNCTION NAME: hwnd() + * PURPOSE: + * retrieves target window handle + * SPECIAL CONSIDERATIONS: + * + *****************************************************/ +extern "C" void __declspec(dllexport) hwnd(HWND hwndParent, + int string_size, + TCHAR *variables, + stack_t **stacktop) +{ + TCHAR s[16] = _T(""); + if (IsWindow(myWnd)) + wsprintf(s, _T("%d"), myWnd); + pushstring(s); +} + +/***************************************************** + * FUNCTION NAME: DllMain() + * PURPOSE: + * Dll main (initialization) entry point + * SPECIAL CONSIDERATIONS: + * + *****************************************************/ +BOOL WINAPI DllMain(HANDLE hInst, + ULONG ul_reason_for_call, + LPVOID lpReserved) +{ + g_hInstance = (HINSTANCE)hInst; + return TRUE; +} diff --git a/src/exdll.h b/src/exdll.h new file mode 100644 index 0000000..1762547 --- /dev/null +++ b/src/exdll.h @@ -0,0 +1,99 @@ +#ifndef _EXDLL_H_ +#define _EXDLL_H_ + +#include + +// only include this file from one place in your DLL. +// (it is all static, if you use it in two places it will fail) + +#define EXDLL_INIT() \ + { \ + g_stringsize = string_size; \ + g_stacktop = stacktop; \ + g_variables = variables; \ + } + +// For page showing plug-ins +#define WM_NOTIFY_OUTER_NEXT (WM_USER + 0x8) +#define WM_NOTIFY_CUSTOM_READY (WM_USER + 0xd) +#define NOTIFY_BYE_BYE 'x' + +typedef struct _stack_t +{ + struct _stack_t *next; + TCHAR text[1]; // this should be the length of string_size +} stack_t; + +static unsigned int g_stringsize; +static stack_t **g_stacktop; +static TCHAR *g_variables; + +enum +{ + INST_0, // $0 + INST_1, // $1 + INST_2, // $2 + INST_3, // $3 + INST_4, // $4 + INST_5, // $5 + INST_6, // $6 + INST_7, // $7 + INST_8, // $8 + INST_9, // $9 + INST_R0, // $R0 + INST_R1, // $R1 + INST_R2, // $R2 + INST_R3, // $R3 + INST_R4, // $R4 + INST_R5, // $R5 + INST_R6, // $R6 + INST_R7, // $R7 + INST_R8, // $R8 + INST_R9, // $R9 + INST_CMDLINE, // $CMDLINE + INST_INSTDIR, // $INSTDIR + INST_OUTDIR, // $OUTDIR + INST_EXEDIR, // $EXEDIR + INST_LANG, // $LANGUAGE + __INST_LAST +}; + +// utility functions (not required but often useful) +static int __stdcall popstring(TCHAR *str) +{ + stack_t *th; + if (!g_stacktop || !*g_stacktop) + return 1; + th = (*g_stacktop); + lstrcpy(str, th->text); + *g_stacktop = th->next; + GlobalFree((HGLOBAL)th); + return 0; +} + +static void __stdcall pushstring(const TCHAR *str) +{ + stack_t *th; + if (!g_stacktop) + return; + th = (stack_t *)GlobalAlloc(GPTR, sizeof(stack_t) + g_stringsize * sizeof(TCHAR)); + lstrcpyn(th->text, str, g_stringsize); + th->next = *g_stacktop; + *g_stacktop = th; +} + +static TCHAR *__stdcall getuservariable(int varnum) +{ + if (varnum < 0 || varnum >= __INST_LAST) + return NULL; + return g_variables + varnum * g_stringsize; +} + +static void __stdcall setuservariable(int varnum, const TCHAR *var) +{ + if (varnum < 0 || varnum >= __INST_LAST) + return; + lstrcpy(g_variables + varnum * g_stringsize, var); +} + +#endif //_EXDLL_H_ diff --git a/src/gif.cpp b/src/gif.cpp new file mode 100644 index 0000000..55ec3c5 --- /dev/null +++ b/src/gif.cpp @@ -0,0 +1,257 @@ +#include +#include +#include +#include +#include +#include + + +// My gratitute to Andy Key. His GBM lib served as a base +// for this short gif decoder. I only added extraction +// of transparansy color and comments. +// Takhir + +#define byte unsigned char +#define word unsigned short + +#define make_word(a,b) (((word)a) + (((word)b) << 8)) + + +typedef int GBM_ERR; + +#define GBM_ERR_GIF_BPP ((GBM_ERR) 1100) +#define GBM_ERR_GIF_TERM ((GBM_ERR) 1101) +#define GBM_ERR_GIF_CODE_SIZE ((GBM_ERR) 1102) +#define GBM_ERR_GIF_CORRUPT ((GBM_ERR) 1103) +#define GBM_ERR_GIF_HEADER ((GBM_ERR) 1104) + +#define GBM_ERR_OK ((GBM_ERR) 0) +#define GBM_ERR_BAD_MAGIC ((GBM_ERR) 5) +#define GBM_ERR_READ ((GBM_ERR) 7) +#define GBM_ERR_WRITE ((GBM_ERR) 8) + + + +typedef unsigned int cword; + +typedef struct + { + BOOLEAN ilace, errok; + int bpp; + byte pal[0x100*3]; + } GIF_PRIV; + + +typedef struct + { + int fd; /* File descriptor to read */ + int inx, size; /* Index and size in bits */ + byte buf[255+3]; /* Buffer holding bits */ + int code_size; /* Number of bits to return at once */ + cword read_mask; /* 2^code_size-1 */ + } READ_CONTEXT; + +typedef struct + { + int x, y, w, h, bpp, pass; + BOOLEAN ilace; + int stride; + byte *data, *data_this_line; + } OUTPUT_CONTEXT; + +typedef unsigned int cword; + +typedef struct { byte r, g, b; } GBMRGB; + +#define PRIV_SIZE 2000 + +typedef struct + { + int w, h, bpp; /* Bitmap dimensions */ + byte priv[PRIV_SIZE]; /* Private internal buffer */ + int trc; + char *szUrl; + } GBM; + + + + +/*...sgif_rhdr:0:*/ +GBM_ERR gif_rhdr(int fd, GBM *gbm) + { + GIF_PRIV *gif_priv = (GIF_PRIV *) gbm->priv; + byte signiture[6], scn_desc[7], image_desc[10]; + int img = -1, img_want = 0; + int bits_gct; + + /* Read and validate signiture block */ + + if ( _read(fd, signiture, 6) != 6 ) + return GBM_ERR_READ; + if ( memcmp(signiture, "GIF87a", 6) && + memcmp(signiture, "GIF89a", 6) ) + return GBM_ERR_BAD_MAGIC; + + /* Read screen descriptor */ + + if ( _read(fd, scn_desc, 7) != 7 ) + return GBM_ERR_READ; + bits_gct = gif_priv->bpp = (scn_desc[4] & 7) + 1; +// bits_gct = ((scn_desc[4] & 0x70) >> 4) + 1; + + if ( scn_desc[4] & 0x80 ) + /* Global colour table follows screen descriptor */ + { + if ( _read(fd, gif_priv->pal, 3 << bits_gct) != (3 << bits_gct) ) + return GBM_ERR_READ; + } + else + /* Blank out palette, but make entry 1 white */ + { + memset(gif_priv->pal, 0, 3 << bits_gct); + gif_priv->pal[3] = + gif_priv->pal[4] = + gif_priv->pal[5] = 0xff; + } + + /* Expected image descriptors / extension blocks / terminator */ + + while ( img < img_want ) + { + if ( _read(fd, image_desc, 1) != 1 ) + return GBM_ERR_READ; + switch ( image_desc[0] ) + { +/*...s0x2c \45\ image descriptor:24:*/ +case 0x2c: + if ( _read(fd, image_desc + 1, 9) != 9 ) + return GBM_ERR_READ; + gbm->w = make_word(image_desc[5], image_desc[6]); + gbm->h = make_word(image_desc[7], image_desc[8]); + gif_priv->ilace = ( (image_desc[9] & 0x40) != 0 ); + + if ( image_desc[9] & 0x80 ) + /* Local colour table follows */ + { + gif_priv->bpp = (image_desc[9] & 7) + 1; + if ( _read(fd, gif_priv->pal, 3 << gif_priv->bpp) != (3 << gif_priv->bpp) ) + return GBM_ERR_READ; + } + + if ( ++img != img_want ) + /* Skip the image data */ + { + byte code_size, block_size; + + if ( _read(fd, &code_size, 1) != 1 ) + return GBM_ERR_READ; + do + { + if ( _read(fd, &block_size, 1) != 1 ) + return GBM_ERR_READ; + _lseek(fd, block_size, SEEK_CUR); + } + while ( block_size ); + } + + break; +/*...e*/ +/*...s0x21 \45\ extension block:24:*/ +/* Ignore all extension blocks */ + +case 0x21: + { +/* Graphics and Comment ControlExtensions added by Takhir */ + byte func_code, byte_count, rslt; + if ( _read(fd, &func_code, 1) != 1 ) + return GBM_ERR_READ; + _read(fd, &byte_count, 1); + switch (func_code) + { + case 0xF9: // GraphicsControlExtensions + byte_count++; + for(;byte_count>0;byte_count--) + { + if ( _read(fd, &rslt, 1) != 1 ) + return GBM_ERR_READ; + if((byte_count==5)&&(rslt&1)) gbm->trc=1; + if((byte_count==2)&&(gbm->trc==1)) + gbm->trc=rslt; + } + break; + case 0xFE: // CommentControlExtensions + if(gbm->szUrl==NULL) + _lseek(fd, byte_count+1, SEEK_CUR); + else + { + gbm->szUrl[0] = 0; + if (_read(fd, gbm->szUrl, byte_count+1) != ((int)byte_count+1) ) + return GBM_ERR_READ; + } + break; + default: // Other Extensions + do + { _lseek(fd, byte_count, SEEK_CUR); + if ( _read(fd, &byte_count, 1) != 1 ) + return GBM_ERR_READ; + } + while ( byte_count ); + } +/* end of changes */ + } + break; +/*...e*/ +/*...s0x3b \45\ terminator:24:*/ +/* Oi, we were hoping to get an image descriptor! */ + +case 0x3b: + return GBM_ERR_GIF_TERM; +/*...e*/ +/*...sdefault:24:*/ +default: + return GBM_ERR_GIF_HEADER; +/*...e*/ + } + } + + switch ( gif_priv->bpp ) + { + case 1: gbm->bpp = 1; break; + case 2: + case 3: + case 4: gbm->bpp = 4; break; + case 5: + case 6: + case 7: + case 8: gbm->bpp = 8; break; + default: return GBM_ERR_GIF_BPP; + } + + return GBM_ERR_OK; + } + +/*...e*/ +/*...sgif_rdata:0:*/ +/*...sread context:0:*/ + + +int getTransparencyColor(TCHAR* fn_src) +{ + int fd; + GBM gbm; + GBMRGB *gbmrgb = (GBMRGB*)(gbm.priv + 8); + + if(lstrcmpi(fn_src + lstrlen(fn_src) - 4, _T(".gif")) != 0) return -1; + gbm.trc = -1; + gbm.szUrl = NULL; + if ((fd = _topen(fn_src, O_RDONLY | O_BINARY))==-1) return 0; + gif_rhdr( fd, &gbm); + _close(fd); + if(gbm.trc == -1 || gbm.trc > 255) return -1; + fd = 0; + memcpy(&fd, &gbmrgb[gbm.trc], 3); + /*char b[64]; + wsprintf(b, "Index %d, color=0x%06x", gbm.trc, fd); + MessageBox(NULL, b, "Index & color", 0);*/ + return fd; +}