diff --git a/resources/img/logo-dark-16.png b/resources/img/logo-dark-16.png new file mode 100644 index 0000000..04a431b Binary files /dev/null and b/resources/img/logo-dark-16.png differ diff --git a/resources/img/logo-dark-32.png b/resources/img/logo-dark-32.png new file mode 100644 index 0000000..8a7bfc2 Binary files /dev/null and b/resources/img/logo-dark-32.png differ diff --git a/resources/img/logo-dark-64.png b/resources/img/logo-dark-64.png new file mode 100644 index 0000000..cb1a91c Binary files /dev/null and b/resources/img/logo-dark-64.png differ diff --git a/resources/img/logo-light-16.png b/resources/img/logo-light-16.png new file mode 100644 index 0000000..04a431b Binary files /dev/null and b/resources/img/logo-light-16.png differ diff --git a/resources/img/logo-light-32.png b/resources/img/logo-light-32.png new file mode 100644 index 0000000..8a7bfc2 Binary files /dev/null and b/resources/img/logo-light-32.png differ diff --git a/resources/img/logo-light-64.png b/resources/img/logo-light-64.png new file mode 100644 index 0000000..cb1a91c Binary files /dev/null and b/resources/img/logo-light-64.png differ diff --git a/resources/img/logo.png b/resources/img/logo.png new file mode 100644 index 0000000..a3bf895 Binary files /dev/null and b/resources/img/logo.png differ diff --git a/resources/img/logo128.png b/resources/img/logo128.png new file mode 100644 index 0000000..8c4974a Binary files /dev/null and b/resources/img/logo128.png differ diff --git a/resources/img/logo16.png b/resources/img/logo16.png new file mode 100644 index 0000000..04a431b Binary files /dev/null and b/resources/img/logo16.png differ diff --git a/resources/img/logo32.png b/resources/img/logo32.png new file mode 100644 index 0000000..8a7bfc2 Binary files /dev/null and b/resources/img/logo32.png differ diff --git a/resources/img/logo48.png b/resources/img/logo48.png new file mode 100644 index 0000000..d25219e Binary files /dev/null and b/resources/img/logo48.png differ diff --git a/resources/img/logo64.png b/resources/img/logo64.png new file mode 100644 index 0000000..cb1a91c Binary files /dev/null and b/resources/img/logo64.png differ diff --git a/resources/img/logo96.png b/resources/img/logo96.png new file mode 100644 index 0000000..24315b9 Binary files /dev/null and b/resources/img/logo96.png differ diff --git a/resources/svg/.gitkeep b/resources/svg/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/resources/svg/.gitkeep @@ -0,0 +1 @@ + diff --git a/resources/logo.svg b/resources/svg/logo.svg similarity index 100% rename from resources/logo.svg rename to resources/svg/logo.svg diff --git a/resources/svg2img.ps1 b/resources/svg2img.ps1 new file mode 100644 index 0000000..5048abb --- /dev/null +++ b/resources/svg2img.ps1 @@ -0,0 +1,149 @@ +$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 +} diff --git a/resources/svg2img.sh b/resources/svg2img.sh new file mode 100755 index 0000000..02f9061 --- /dev/null +++ b/resources/svg2img.sh @@ -0,0 +1,144 @@ +#!/usr/bin/env bash +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +svg_dir="$script_dir/svg" +out_dir="$script_dir/img" +logo_svg="$script_dir/logo.svg" +sizes=(16 32 64) +logo_sizes=(16 32 48 64 96 128) +themes=(light dark) +inkscape_cmd=() +temp_dir="" + +cleanup() { + if [[ -n "$temp_dir" && -d "$temp_dir" ]]; then + rm -rf "$temp_dir" + fi +} + +trap cleanup EXIT + +get_theme_color() { + case "$1" in + light) printf '%s\n' '#000000' ;; + dark) printf '%s\n' '#ffffff' ;; + *) + printf 'Unknown theme: %s\n' "$1" >&2 + exit 1 + ;; + esac +} + +ensure_temp_svg() { + local input_svg="$1" + local color="$2" + local temp_svg="$3" + + python3 - "$input_svg" "$color" "$temp_svg" <<'PY' +import pathlib +import re +import sys + +input_path = pathlib.Path(sys.argv[1]) +color = sys.argv[2] +output_path = pathlib.Path(sys.argv[3]) +content = input_path.read_text(encoding="utf-8") +patched, count = re.subn(r"]*?)>", f'', content, count=1) +if count != 1: + raise SystemExit("Couldn't find tag to patch.") +output_path.write_text(patched, encoding="utf-8") +PY +} + +export_png() { + local input_svg="$1" + local out_file="$2" + local size="$3" + + echo "Exporting $out_file..." + "${inkscape_cmd[@]}" "$input_svg" \ + --export-type=png \ + --export-filename="$out_file" \ + --export-width="$size" \ + --export-height="$size" \ + --actions=export-do +} + +resolve_inkscape_cmd() { + if command -v inkscape >/dev/null 2>&1; then + inkscape_cmd=(inkscape) + return 0 + fi + + if command -v flatpak >/dev/null 2>&1; then + if flatpak info org.inkscape.Inkscape >/dev/null 2>&1; then + inkscape_cmd=( + flatpak + run + --filesystem="$script_dir" + --filesystem=/tmp + --command=inkscape + org.inkscape.Inkscape + ) + return 0 + fi + fi + + echo "Inkscape CLI is not installed or not in PATH, and Flatpak Inkscape (org.inkscape.Inkscape) was not found." >&2 + exit 1 +} + +mkdir -p "$out_dir" "$svg_dir" + +if ! command -v python3 >/dev/null 2>&1; then + echo "python3 is required to patch the SVG color attribute." >&2 + exit 1 +fi + +resolve_inkscape_cmd +temp_dir="$(mktemp -d "/tmp/psitransfer-filelink-svg2img.XXXXXX")" + +if [[ -f "$logo_svg" ]]; then + for size in "${logo_sizes[@]}"; do + export_png "$logo_svg" "$out_dir/logo${size}.png" "$size" + done + + # Keep a generic logo export for docs/UI usage. + export_png "$logo_svg" "$out_dir/logo.png" 512 +else + echo "Logo source not found: $logo_svg" >&2 +fi + +shopt -s nullglob +svg_files=("$svg_dir"/*.svg) +shopt -u nullglob + +if [[ ${#svg_files[@]} -eq 0 ]]; then + echo "No themed SVG icons found in $svg_dir. Logo exports completed." + exit 0 +fi + +temp_svg="$temp_dir/themed-icon.svg" + +for svg_path in "${svg_files[@]}"; do + base_name="$(basename "${svg_path%.svg}")" + + for theme in "${themes[@]}"; do + color="$(get_theme_color "$theme")" + ensure_temp_svg "$svg_path" "$color" "$temp_svg" + + for size in "${sizes[@]}"; do + out_file="$out_dir/$base_name-$theme-$size.png" + echo "Exporting $out_file (color $color)..." + "${inkscape_cmd[@]}" "$temp_svg" \ + --export-type=png \ + --export-filename="$out_file" \ + --export-width="$size" \ + --export-height="$size" \ + --actions=export-do + done + done +done + +echo "Done generating logo PNGs and light/dark themed icon PNGs."