altos/telefireone-v2.0: Remove build of ao_product.h from Makefile
[fw/altos] / icon / led.5c
1 /*
2  * Copyright © 2018 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  */
14
15 /*
16  * Generate LED images for rocketview and launchcontrol
17  */
18
19 autoimport Cairo;
20
21 void led (cairo_t cr, real red, real green, real blue, bool on)
22 {
23     translate (cr, .5, .5);
24
25     /* basic unilluminated LED */
26
27     if (true)
28     {
29         set_source_rgb (cr, red *.4, green *.4, blue *.4);
30         move_to (cr, 1, 1/2);
31         arc (cr, .5, .5, .5, 0, pi*2);
32         fill (cr);
33     }
34
35     /* Bright spot of LED illumination */
36     if (on)
37     {
38         pattern_t       led = Pattern::create_radial (1/2, 1/2, 0,
39                                                       1/2, 1/2, .4);
40         Pattern::add_color_stop_rgba (led, 0, red, green, blue, 1);
41         Pattern::add_color_stop_rgba (led, .5, red, green, blue, .8);
42         Pattern::add_color_stop_rgba (led, 1, red, green, blue, 0);
43         set_source (cr, led);
44         move_to (cr, 1, 1/2);
45         arc (cr, .5, .5, .5, 0, pi*2);
46         fill (cr);
47     }
48
49     /* Bezel */
50     if (true)
51     {
52         pattern_t       ring = Pattern::create_radial (.5, .5, .4, .5, .5, .5);
53         Pattern::add_color_stop_rgba (ring, 0, 0, 0, 0, 1);
54         Pattern::add_color_stop_rgba (ring, .5, 0, 0, 0, 1);
55         Pattern::add_color_stop_rgba (ring, 1, .5, .5, .5, 1);
56         set_source (cr, ring);
57         move_to (cr, 1, 1/2);
58         arc (cr, .5, .5, .5, 0, pi*2);
59         move_to (cr, 1, 1/2);
60         arc_negative (cr, .5, .5, .45, pi*2, 0);
61         fill (cr);
62     }
63
64     /* Specular highlight from room illumination */
65     if (true)
66     {
67         pattern_t       room = Pattern::create_radial (1/3, 1/3, 0, 1/3, 1/3, 1/2);
68         Pattern::add_color_stop_rgba (room, 0, 1, 1, 1, .4);
69         Pattern::add_color_stop_rgba (room, 1, 1, 1, 1, 0);
70         set_source (cr, room);
71         move_to (cr, 1, 1/2);
72         arc (cr, .5, .5, .5, 0, pi*2);
73         fill (cr);
74     }
75
76 }
77
78 /*
79  * Desired LED image size in pixels
80  */
81 int diameter = 12;
82
83 void do_one_svg (string name, real red, real green, real blue, bool on)
84 {
85     cairo_t cr = new_svg (name, diameter, diameter);
86
87     translate (cr, -width(cr)/2, -height(cr)/2);
88     scale (cr, width(cr), height(cr));
89     led (cr, red, green, blue, on);
90     destroy (cr);
91 }
92
93 void do_one_png (string name, real red, real green, real blue, bool on)
94 {
95     cairo_t cr = new_image (diameter, diameter);
96
97     translate (cr, -width(cr)/2, -height(cr)/2);
98     scale (cr, width(cr), height(cr));
99     led (cr, red, green, blue, on);
100     write_to_png (cr, name);
101     destroy (cr);
102 }
103
104 void do_one(string name,  real red, real green, real blue, bool on)
105 {
106     do_one_png(name + ".png", red, green, blue, on);
107     do_one_svg(name + ".svg", red, green, blue, on);
108 }
109
110 void doit ()
111 {
112     do_one ("redled", 1, 0, 0, true);
113     do_one ("redoff", 1, 0, 0, false);
114     do_one ("greenled", 0, 1, .4824, true);
115     do_one ("greenoff", 0, 1, .4824, false);
116     do_one ("grayled", .9, .9, .9, false);
117     do_one ("grayon", .9, .9, .9, true);
118 }
119
120 typedef struct {
121     real        red, green, blue;
122     bool        on;
123 } stock_t;
124
125 stock_t[string] stock_leds = {
126     "redled" => {
127         .red = 1,
128         .green = 0,
129         .blue = 0,
130         .on = true
131     },
132     "redoff" => {
133         .red = 1,
134         .green = 0,
135         .blue = 0,
136         .on = false
137     },
138     "greenled" => {
139         .red = 0,
140         .green = 1,
141         .blue = .4824,
142         .on = true
143     },
144     "greenoff" => {
145         .red = 0,
146         .green = 1,
147         .blue = .4824,
148         .on = false
149     },
150     "grayon" => {
151         .red = .9,
152         .green = .9,
153         .blue = .9,
154         .on = true
155     },
156     "grayled" => {
157         .red = .9,
158         .green = .9,
159         .blue = .9,
160         .on = false
161     },
162 };
163
164 void main ()
165 {
166     for (int i = 1; i < dim(argv); i++) {
167         string          name = argv[i];
168         string[]        bits = String::split(name, ".");
169
170         if (dim(bits) != 2) {
171             File::fprintf(stderr, "Filename is weird: \"%s\"\n", argv[i]);
172             exit (1);
173         }
174
175         stock_t stock = stock_leds[bits[0]];
176         switch (bits[1]) {
177         case "png":
178             do_one_png(argv[i], stock.red, stock.green, stock.blue, stock.on);
179             break;
180         case "svg":
181             do_one_svg(argv[i], stock.red, stock.green, stock.blue, stock.on);
182             break;
183         }
184     }
185 }
186
187 if (dim(argv) > 0) {
188     main();
189 }