lsa-planer

LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.

/ src render farbe.ts

1,6 KB Rohdatei
src/render/farbe.ts — 41 Zeilen
1 /**
2 * Farben mit Alphakanal - eine Auskunft fuer alle Ausgabewege.
3 *
4 * Eine achtstellige Farbe wie `#c2410c22` traegt in den letzten beiden Stellen
5 * ihre Deckung. Der Bildschirm versteht das unmittelbar; das PDF muss die
6 * Deckung getrennt in den Grafikzustand geben (siehe `pdfSurface.ts`), und die
7 * Zeichenbeschreibung des Lageplanblatts muss wissen, welche ihrer Farben
8 * halbdurchsichtig sind, um sie nicht zu unterlegen.
9 *
10 * DREI STELLEN, EINE REGEL: Ohne diese Datei stuende der Ausdruck "was ist eine
11 * Farbe mit Alphakanal" dreimal im Baum, und die Fassungen liefen bei der
12 * ersten Erweiterung auseinander.
13 */
14
15 const MIT_ALPHA = /^#([0-9a-fA-F]{6})([0-9a-fA-F]{2})$/;
16
17 export interface Farbanteil {
18 /** Die Farbe ohne die achte Stelle - so nimmt sie jsPDF. */
19 readonly grund: string;
20 /** Deckung von 0 (unsichtbar) bis 1 (deckend). */
21 readonly deckung: number;
22 }
23
24 /**
25 * Zerlegt eine Farbe in Grundfarbe und Deckung.
26 *
27 * Was keinen Alphakanal traegt, ist voll deckend und geht unveraendert durch -
28 * auch eine unbrauchbare Angabe. Sie zu erfinden waere schlimmer, als sie
29 * weiterzureichen: Wie eine unbekannte Farbangabe zu behandeln ist, ist beim
30 * Ausgabeweg zu Hause und nicht hier.
31 */
32 export function farbanteil(farbe: string): Farbanteil {
33 const treffer = MIT_ALPHA.exec(farbe);
34 if (treffer === null) return { grund: farbe, deckung: 1 };
35 return { grund: `#${treffer[1]!}`, deckung: parseInt(treffer[2]!, 16) / 255 };
36 }
37
38 /** Traegt die Farbe einen Alphakanal? */
39 export function halbdurchsichtig(farbe: string): boolean {
40 return farbanteil(farbe).deckung < 1;
41 }