/** * Farben mit Alphakanal - eine Auskunft fuer alle Ausgabewege. * * Eine achtstellige Farbe wie `#c2410c22` traegt in den letzten beiden Stellen * ihre Deckung. Der Bildschirm versteht das unmittelbar; das PDF muss die * Deckung getrennt in den Grafikzustand geben (siehe `pdfSurface.ts`), und die * Zeichenbeschreibung des Lageplanblatts muss wissen, welche ihrer Farben * halbdurchsichtig sind, um sie nicht zu unterlegen. * * DREI STELLEN, EINE REGEL: Ohne diese Datei stuende der Ausdruck "was ist eine * Farbe mit Alphakanal" dreimal im Baum, und die Fassungen liefen bei der * ersten Erweiterung auseinander. */ const MIT_ALPHA = /^#([0-9a-fA-F]{6})([0-9a-fA-F]{2})$/; export interface Farbanteil { /** Die Farbe ohne die achte Stelle - so nimmt sie jsPDF. */ readonly grund: string; /** Deckung von 0 (unsichtbar) bis 1 (deckend). */ readonly deckung: number; } /** * Zerlegt eine Farbe in Grundfarbe und Deckung. * * Was keinen Alphakanal traegt, ist voll deckend und geht unveraendert durch - * auch eine unbrauchbare Angabe. Sie zu erfinden waere schlimmer, als sie * weiterzureichen: Wie eine unbekannte Farbangabe zu behandeln ist, ist beim * Ausgabeweg zu Hause und nicht hier. */ export function farbanteil(farbe: string): Farbanteil { const treffer = MIT_ALPHA.exec(farbe); if (treffer === null) return { grund: farbe, deckung: 1 }; return { grund: `#${treffer[1]!}`, deckung: parseInt(treffer[2]!, 16) / 255 }; } /** Traegt die Farbe einen Alphakanal? */ export function halbdurchsichtig(farbe: string): boolean { return farbanteil(farbe).deckung < 1; }