2 * Copyright © 2018 Keith Packard <keithp@keithp.com>
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.
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.
16 * Generate LED images for rocketview and launchcontrol
21 void led (cairo_t cr, real red, real green, real blue, bool on)
23 translate (cr, .5, .5);
25 /* basic unilluminated LED */
29 set_source_rgb (cr, red *.4, green *.4, blue *.4);
31 arc (cr, .5, .5, .5, 0, pi*2);
35 /* Bright spot of LED illumination */
38 pattern_t led = Pattern::create_radial (1/2, 1/2, 0,
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);
45 arc (cr, .5, .5, .5, 0, pi*2);
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);
58 arc (cr, .5, .5, .5, 0, pi*2);
60 arc_negative (cr, .5, .5, .45, pi*2, 0);
64 /* Specular highlight from room illumination */
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);
72 arc (cr, .5, .5, .5, 0, pi*2);
79 * Desired LED image size in pixels
83 void do_one_svg (string name, real red, real green, real blue, bool on)
85 cairo_t cr = new_svg (name, diameter, diameter);
87 translate (cr, -width(cr)/2, -height(cr)/2);
88 scale (cr, width(cr), height(cr));
89 led (cr, red, green, blue, on);
93 void do_one_png (string name, real red, real green, real blue, bool on)
95 cairo_t cr = new_image (diameter, diameter);
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);
104 void do_one(string name, real red, real green, real blue, bool on)
106 do_one_png(name + ".png", red, green, blue, on);
107 do_one_svg(name + ".svg", red, green, blue, on);
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);
121 real red, green, blue;
125 stock_t[string] stock_leds = {
166 for (int i = 1; i < dim(argv); i++) {
167 string name = argv[i];
168 string[] bits = String::split(name, ".");
170 if (dim(bits) != 2) {
171 File::fprintf(stderr, "Filename is weird: \"%s\"\n", argv[i]);
175 stock_t stock = stock_leds[bits[0]];
178 do_one_png(argv[i], stock.red, stock.green, stock.blue, stock.on);
181 do_one_svg(argv[i], stock.red, stock.green, stock.blue, stock.on);