$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path $svgDir = Join-Path $scriptDir "svg" $outDir = Join-Path $scriptDir "img" $logoSvg = Join-Path $scriptDir "logo.svg" $sizes = @(16, 32, 64) $logoSizes = @(16, 32, 48, 64, 96, 128) $themes = @{ "light" = "#000000" "dark" = "#ffffff" } $inkscapeCmd = @() $tmpRoot = if (Test-Path -Path "/tmp") { "/tmp" } else { [System.IO.Path]::GetTempPath() } $tempDir = Join-Path $tmpRoot ("psitransfer-filelink-svg2img-" + [guid]::NewGuid().ToString()) $tempSvg = Join-Path $tempDir "themed-icon.svg" if (!(Test-Path -Path $outDir)) { New-Item -ItemType Directory -Path $outDir | Out-Null } if (!(Test-Path -Path $svgDir)) { New-Item -ItemType Directory -Path $svgDir | Out-Null } if (!(Test-Path -Path $tempDir)) { New-Item -ItemType Directory -Path $tempDir | Out-Null } function Remove-TempFiles { if (Test-Path -Path $tempDir) { Remove-Item -Path $tempDir -Recurse -Force } } function Resolve-InkscapeCommand { $nativeInkscape = Get-Command "inkscape" -ErrorAction SilentlyContinue if ($nativeInkscape) { return @($nativeInkscape.Source) } $flatpak = Get-Command "flatpak" -ErrorAction SilentlyContinue if ($flatpak) { & $flatpak.Source info org.inkscape.Inkscape *> $null if ($LASTEXITCODE -eq 0) { return @( $flatpak.Source, "run", "--filesystem=$scriptDir", "--filesystem=/tmp", "--command=inkscape", "org.inkscape.Inkscape" ) } } throw "Inkscape CLI is not installed or not in PATH, and Flatpak Inkscape (org.inkscape.Inkscape) was not found." } function Export-Png { param ( [string] $InputSvg, [string] $OutFile, [int] $Size ) Write-Host "Exporting $OutFile..." Invoke-Inkscape @( $InputSvg, "--export-type=png", "--export-filename=$OutFile", "--export-width=$Size", "--export-height=$Size", "--actions=export-do" ) } function Invoke-Inkscape { param ( [string[]] $Arguments ) & $inkscapeCmd[0] @($inkscapeCmd | Select-Object -Skip 1) @Arguments } function Inject-Color { param ( [string] $Original, [string] $Color ) $content = Get-Content $Original -Raw if ($content -match ']*>') { $patched = $content -replace ']*?)>', "" Set-Content -Path $tempSvg -Value $patched } else { throw "Couldn't find tag to patch." } } try { $inkscapeCmd = Resolve-InkscapeCommand if (Test-Path -Path $logoSvg) { foreach ($size in $logoSizes) { Export-Png -InputSvg $logoSvg -OutFile (Join-Path $outDir "logo$size.png") -Size $size } Export-Png -InputSvg $logoSvg -OutFile (Join-Path $outDir "logo.png") -Size 512 } else { Write-Warning "Logo source not found: $logoSvg" } $svgFiles = Get-ChildItem -Path $svgDir -Filter *.svg -ErrorAction SilentlyContinue if (-not $svgFiles) { Write-Host "No themed SVG icons found in $svgDir. Logo exports completed." exit 0 } foreach ($svgFile in $svgFiles) { $svgPath = $svgFile.FullName $baseName = $svgFile.BaseName foreach ($theme in $themes.Keys) { $color = $themes[$theme] Inject-Color -Original $svgPath -Color $color foreach ($size in $sizes) { $outFile = Join-Path $outDir "$baseName-$theme-$size.png" Write-Host "Exporting $outFile (color $color)..." Invoke-Inkscape @( $tempSvg, "--export-type=png", "--export-filename=$outFile", "--export-width=$size", "--export-height=$size", "--actions=export-do" ) } } } Write-Host "Done generating logo PNGs and light/dark themed icon PNGs." } finally { Remove-TempFiles }