Ein negativer Rand dehnt, was er umschließt, meldet nach außen aber die alte Breite. Er stand ganz oben, also legten sich Verlauf und Schrift nur über den alten Bereich — und die zwölf Punkte daneben blieben ohne Verlauf und damit hell. Gemessen: dort 60 Helligkeit, im Inhaltsbereich 19, bei gleichem Bild. Jetzt wird erst der Verlauf gelegt, dann gedehnt, dann die Schrift gesetzt. Der Verlauf deckt bis zum Rand, die Schrift bleibt auf der gemeldeten Breite und fängt von selbst dort an, wo auch die Reihen darunter anfangen. Der Weg dorthin ging über drei Irrtümer, die alle widerlegt sind: nicht `glassEffect` (der Streifen blieb bei undurchsichtiger Fläche), nicht der Platzhalter (er blieb bei grünem Platzhalter), nicht der Scroll-Anzeiger (er blieb ohne Bildlaufansicht). Die Bildlaufansicht in der Leiste ist trotzdem draußen — sie wurde nicht gebraucht. Dazu: der Aufmacher nimmt die volle Höhe statt achtundachtzig Prozent, der Haarstrich der Leiste ist zurückhaltender, und auf dem iPhone ist der Aufmacher das **Plakat** statt des Hintergrundbilds. Ein 16:9-Bild hochkant zeigt einen Ausschnitt aus der Mitte; ein Plakat ist von vornherein hochkant und passt ohne Beschnitt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
54 lines
2.3 KiB
Swift
54 lines
2.3 KiB
Swift
import Foundation
|
||
import FlixyDesign
|
||
import MediaKit
|
||
|
||
/// Woher der Aufmacher seine Bilder nimmt.
|
||
///
|
||
/// An **einer** Stelle, weil zwei Stellen es schon zweimal falsch gemacht
|
||
/// haben:
|
||
///
|
||
/// Erstens wurde das Hintergrundbild in 900×1200 angefordert — hochkant — und
|
||
/// dann in einem 16:9-Rahmen gezeigt. Zu sehen war davon ein schmaler Streifen
|
||
/// aus der Mitte; vom Bild fehlte oben und unten je ein Drittel. Die Maße
|
||
/// richten sich jetzt nach dem Rahmen, in dem das Bild landet.
|
||
///
|
||
/// Zweitens holt das Karussell das nächste Bild vor, solange das aktuelle noch
|
||
/// steht. Weicht dessen Adresse auch nur in einer Zahl ab, ist es eine andere
|
||
/// Adresse, der Zwischenspeicher trifft daneben und der Aufmacher blendet auf
|
||
/// eine graue Fläche über.
|
||
enum HeroArtwork {
|
||
/// Die Maße, in denen das Bild angefordert wird.
|
||
///
|
||
/// Im Seitenverhältnis des Rahmens, in dem es landet — sonst schneidet der
|
||
/// Server zu, und man sieht einen Streifen aus der Mitte.
|
||
static func size(compact: Bool) -> (width: Int, height: Int) {
|
||
compact ? (600, 900) : (1920, 1080)
|
||
}
|
||
|
||
static func aspectRatio(compact: Bool) -> CGFloat {
|
||
compact ? FlixyAspectRatio.poster : FlixyAspectRatio.hero
|
||
}
|
||
|
||
/// Auf einem schmalen Bildschirm das **Plakat**, sonst das Hintergrundbild.
|
||
///
|
||
/// Ein Hintergrundbild ist 16:9. Hochkant gezeigt fehlen ihm links und
|
||
/// rechts je ein Viertel, und zu sehen ist ein Ausschnitt aus der Mitte —
|
||
/// vom Bild bleibt wenig übrig. Ein Plakat ist von vornherein hochkant;
|
||
/// es passt in den Rahmen, ohne dass etwas weggeschnitten werden muss.
|
||
static func backdropURL(for item: MediaItem, backend: any MediaBackend, compact: Bool) -> URL? {
|
||
let size = size(compact: compact)
|
||
let path = compact
|
||
? (item.posterArtworkPath ?? item.art)
|
||
: (item.art ?? item.seriesArt ?? item.thumb)
|
||
return backend.artworkURL(path: path, width: size.width, height: size.height)
|
||
}
|
||
|
||
/// Der freigestellte Schriftzug — ohne Bild-Transcoder.
|
||
///
|
||
/// Er ist ein PNG mit durchsichtigem Grund, und der Transcoder liefert
|
||
/// JPEG. Aus dem Schriftzug würde sonst ein schwarzer Kasten.
|
||
static func logoURL(for item: MediaItem, backend: any MediaBackend) -> URL? {
|
||
backend.rawImageURL(path: item.clearLogoPath)
|
||
}
|
||
}
|