From 0be2a971bad3fc12359b7e1818822ff878bd1c93 Mon Sep 17 00:00:00 2001 From: winebarrel Date: Mon, 10 Aug 2026 14:30:35 +0900 Subject: [PATCH] Bundle a thumbnail for the screen saver list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without one the list draws a generic spiral, which says nothing about what the saver is. A picture of the cat, mid-wander with prints behind it, says the whole thing at 90x58. Rendered by the preview app rather than drawn by hand, so it is the real thing: one cat on the plain grey backdrop, scratch marks off, and fast enough that the twelve seconds of paw prints it keeps cover some ground. `make thumbnail` regenerates both sizes from one 2x render. Where the cat ends up is down to where it wandered, so that target is worth running until you get one you like — this one is centred. --- Makefile | 12 ++++++++++++ NecoSaver.xcodeproj/project.pbxproj | 16 ++++++++++++++++ Resources/thumbnail.png | Bin 0 -> 2717 bytes Resources/thumbnail@2x.png | Bin 0 -> 3803 bytes 4 files changed, 28 insertions(+) create mode 100644 Resources/thumbnail.png create mode 100644 Resources/thumbnail@2x.png diff --git a/Makefile b/Makefile index a17a6ae..c709898 100644 --- a/Makefile +++ b/Makefile @@ -42,6 +42,18 @@ preview: $(XCODEBUILD) -scheme $(PREVIEW_SCHEME) build $(PREVIEW) +# The picture the screen saver list shows before it starts a live preview. +# Rendered at 2x and downsampled, so both sizes come from one run. Where the cat +# ends up is down to where it happened to wander, so run this until you get one +# you like. +.PHONY: thumbnail +thumbnail: + $(XCODEBUILD) -scheme $(PREVIEW_SCHEME) build + $(PREVIEW) --snapshot Resources/thumbnail@2x.png \ + --preview --size 90x58 --frames 2400 --grey --cats 1 --speed 5 + cp Resources/thumbnail@2x.png Resources/thumbnail.png + sips -z 58 90 Resources/thumbnail.png >/dev/null + .PHONY: lint lint: swiftlint --strict diff --git a/NecoSaver.xcodeproj/project.pbxproj b/NecoSaver.xcodeproj/project.pbxproj index 8653309..7b13293 100644 --- a/NecoSaver.xcodeproj/project.pbxproj +++ b/NecoSaver.xcodeproj/project.pbxproj @@ -15,6 +15,8 @@ CE0000000000000000000106 /* NecoSaverEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0000000000000000000006 /* NecoSaverEngine.swift */; }; CE0000000000000000000107 /* ConfigureSheetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0000000000000000000007 /* ConfigureSheetController.swift */; }; CE0000000000000000000108 /* NecoSaverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0000000000000000000008 /* NecoSaverView.swift */; }; + CE0000000000000000000121 /* thumbnail.png in Resources */ = {isa = PBXBuildFile; fileRef = CE0000000000000000000021 /* thumbnail.png */; }; + CE0000000000000000000122 /* thumbnail@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CE0000000000000000000022 /* thumbnail@2x.png */; }; CE0000000000000000000109 /* Wallpaper.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0000000000000000000010 /* Wallpaper.swift */; }; CE0000000000000000000111 /* Sprites.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0000000000000000000001 /* Sprites.swift */; }; CE0000000000000000000112 /* SpriteCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0000000000000000000002 /* SpriteCache.swift */; }; @@ -43,6 +45,8 @@ CE0000000000000000000008 /* NecoSaverView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NecoSaverView.swift; sourceTree = ""; }; CE0000000000000000000010 /* Wallpaper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Wallpaper.swift; sourceTree = ""; }; CE0000000000000000000009 /* PreviewApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewApp.swift; sourceTree = ""; }; + CE0000000000000000000021 /* thumbnail.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = thumbnail.png; sourceTree = ""; }; + CE0000000000000000000022 /* thumbnail@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "thumbnail@2x.png"; sourceTree = ""; }; CE0000000000000000000011 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; CE0000000000000000000012 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; CE0000000000000000000013 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; @@ -91,6 +95,15 @@ path = Sources; sourceTree = ""; }; + CE0000000000000000000302 /* Resources */ = { + isa = PBXGroup; + children = ( + CE0000000000000000000021 /* thumbnail.png */, + CE0000000000000000000022 /* thumbnail@2x.png */, + ); + path = Resources; + sourceTree = ""; + }; CE0000000000000000000303 /* Preview */ = { isa = PBXGroup; children = ( @@ -122,6 +135,7 @@ isa = PBXGroup; children = ( CE0000000000000000000301 /* Sources */, + CE0000000000000000000302 /* Resources */, CE0000000000000000000303 /* Preview */, CE0000000000000000000013 /* README.md */, CE0000000000000000000304 /* Frameworks */, @@ -207,6 +221,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + CE0000000000000000000121 /* thumbnail.png in Resources */, + CE0000000000000000000122 /* thumbnail@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Resources/thumbnail.png b/Resources/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..5de43c84ccf3c1a54be13adfa9e41b14da61cba2 GIT binary patch literal 2717 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 literal 0 HcmV?d00001 diff --git a/Resources/thumbnail@2x.png b/Resources/thumbnail@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc606eab33a205323145824a58e10460cb8e7d9 GIT binary patch literal 3803 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 literal 0 HcmV?d00001