From 10644ff4ef1ce2b37b81c62b884b9cbb3ca35dbd Mon Sep 17 00:00:00 2001 From: Till Date: Thu, 14 May 2026 21:02:17 +0200 Subject: [PATCH] =?UTF-8?q?icon:=20vereinfachte=20Anf=C3=BChrungszeichen-G?= =?UTF-8?q?lyphe=20als=20Platzhalter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Z + zwei Akzent-Quotes lieferten ein unsauber gerendertes PNG (Z fehlte aufgrund Font-Bounds-Mathematik bei großem Pointsize). Reduziert auf eine zentrierte Öffnungs-Anführung („) — ikonisch auch bei 40×40, klar erkennbar als Quotes-App. Platzhalter — vor Launch durch Designer-Icon ersetzen. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../AppIcon.appiconset/AppIcon-1024.png | Bin 34353 -> 37359 bytes scripts/make-appicon.swift | 67 +++++++----------- 2 files changed, 27 insertions(+), 40 deletions(-) diff --git a/Sources/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png b/Sources/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png index ca1f689185a1fffc24171911a20bf1cecbed80bd..10557e89de2b9df5efbb2d239a7345af90d88542 100644 GIT binary patch literal 37359 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 literal 34353 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 G-v0w(rh>!( diff --git a/scripts/make-appicon.swift b/scripts/make-appicon.swift index 64002c3..7d4ed84 100644 --- a/scripts/make-appicon.swift +++ b/scripts/make-appicon.swift @@ -3,17 +3,15 @@ // // Design (paper-Variant aus @mana/themes): // - Background: warm Sienna (paper-primary, HSL 18 50% 38%) -// - Zwei stilisierte typografische Anführungszeichen oben in -// gebrochenem Weiß (paper-background) -// - Großes serifenbetontes „Z" zentriert in dunklem Sepia +// - Ein großes typografisches Anführungszeichen mittig in +// gebrochenem Weiß. Reduziert, klar lesbar bei jeder Größe. // // Aufruf: // swift scripts/make-appicon.swift // // Schreibt nach: Sources/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png // -// Dies ist ein Platzhalter — vor App-Store-Submission durch ein -// designter Icon ersetzen. +// Platzhalter — vor App-Store-Launch durch designtes Icon ersetzen. import AppKit import CoreGraphics @@ -36,44 +34,31 @@ let background = CGColor(red: 0.57, green: 0.30, blue: 0.19, alpha: 1) ctx.setFillColor(background) ctx.fill(CGRect(x: 0, y: 0, width: size, height: size)) -// Zwei „Anführungs"-Akzente oben — gebrochenes Weiß (paper-bg-light) -let accent = CGColor(red: 0.95, green: 0.93, blue: 0.88, alpha: 0.92) -let quoteFont = NSFont(name: "Georgia-Bold", size: 360) - ?? NSFont.boldSystemFont(ofSize: 360) -let quoteAttrs: [NSAttributedString.Key: Any] = [ - .font: quoteFont, - .foregroundColor: NSColor(cgColor: accent) ?? .white, +// Großes typografisches Öffnungs-Quote („) in gebrochenem Weiß. +// Georgia-Bold rendert es als zwei "Tropfen" — ikonisch genug, um +// auch im 60×60 oder 40×40 erkennbar zu bleiben. +let glyph = "\u{201C}" // “ +let glyphFont = NSFont(name: "Georgia-Bold", size: 900) + ?? NSFont.boldSystemFont(ofSize: 900) +let accent = NSColor( + srgbRed: 0.95, green: 0.93, blue: 0.88, alpha: 1.0 +) +let attrs: [NSAttributedString.Key: Any] = [ + .font: glyphFont, + .foregroundColor: accent, ] +let attrStr = NSAttributedString(string: glyph, attributes: attrs) +let line = CTLineCreateWithAttributedString(attrStr) +let bounds = CTLineGetImageBounds(line, ctx) -// Anführungszeichen links („) -let leftQuote = NSAttributedString(string: "\u{201E}", attributes: quoteAttrs) -let leftLine = CTLineCreateWithAttributedString(leftQuote) -ctx.textPosition = CGPoint(x: 160, y: 520) -CTLineDraw(leftLine, ctx) - -// Anführungszeichen rechts (") -let rightQuote = NSAttributedString(string: "\u{201C}", attributes: quoteAttrs) -let rightLine = CTLineCreateWithAttributedString(rightQuote) -ctx.textPosition = CGPoint(x: 620, y: 520) -CTLineDraw(rightLine, ctx) - -// Großes „Z" mittig — dunkles Sepia, serif -let zFont = NSFont(name: "Georgia-Bold", size: 640) - ?? NSFont.boldSystemFont(ofSize: 640) -let darkSepia = CGColor(red: 0.22, green: 0.16, blue: 0.12, alpha: 1) -let zAttrs: [NSAttributedString.Key: Any] = [ - .font: zFont, - .foregroundColor: NSColor(cgColor: darkSepia) ?? .black, -] -let zStr = NSAttributedString(string: "Z", attributes: zAttrs) -let zLine = CTLineCreateWithAttributedString(zStr) -let zBounds = CTLineGetImageBounds(zLine, ctx) -let tx = (CGFloat(size) - zBounds.width) / 2 - zBounds.origin.x -let ty = (CGFloat(size) - zBounds.height) / 2 - zBounds.origin.y - 40 +// Zentrieren auf der Canvas. CTLineGetImageBounds gibt das +// bounding-box im aktuellen Coordinate-System zurück (bottom-up +// in CG); origin.y kann negativ sein bei Glyphs mit Descender. +let tx = (CGFloat(size) - bounds.width) / 2.0 - bounds.origin.x +let ty = (CGFloat(size) - bounds.height) / 2.0 - bounds.origin.y ctx.textPosition = CGPoint(x: tx, y: ty) -CTLineDraw(zLine, ctx) +CTLineDraw(line, ctx) -// PNG schreiben guard let cgImage = ctx.makeImage() else { print("makeImage failed") exit(1) @@ -84,6 +69,8 @@ guard let data = bitmap.representation(using: .png, properties: [:]) else { exit(1) } -let target = URL(fileURLWithPath: "Sources/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png") +let target = URL( + fileURLWithPath: "Sources/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png" +) try data.write(to: target) print("Wrote \(target.path) (\(data.count) bytes)")