1package renderer
  2
  3import (
  4	"fmt"
  5	"image"
  6	"image/color"
  7	"image/draw"
  8	"image/png"
  9	"log"
 10	"math"
 11	"os"
 12	"strconv"
 13	"time"
 14
 15	"github.com/pbnjay/pixfont"
 16)
 17
 18var FrameBuffers []*image.Gray
 19var PerformanceTrackerTimer int64
 20var ScreenCount int
 21var ScreenWidth int
 22var ScreenHeight int
 23
 24func checkError(error error) {
 25	if error != nil {
 26		log.Fatal(error)
 27	}
 28}
 29
 30func InitFrameBuffers() {
 31	for i := 0; i < ScreenCount; i++ {
 32		upLeft := image.Point{0, 0}
 33		lowRight := image.Point{ScreenWidth, ScreenHeight}
 34		img := image.NewGray(image.Rectangle{upLeft, lowRight})
 35		FrameBuffers = append(FrameBuffers, img)
 36	}
 37}
 38
 39func DrawPixel(x int, y int, v int) {
 40	FrameBuffers[int(math.Floor(float64(x)/float64(ScreenWidth)))].Set(x-int(math.Floor(float64(x)/float64(ScreenWidth)))*ScreenWidth, y, color.Gray{uint8(255 * v)})
 41}
 42
 43func DrawHorizontalLine(startX int, startY, length int, v int) {
 44	for i := 0; i < length; i++ {
 45		DrawPixel(startX+i, startY, v)
 46	}
 47}
 48
 49func DrawVerticalLine(startX int, startY, length int, v int) {
 50	for i := 0; i < length; i++ {
 51		DrawPixel(startX, startY+i, v)
 52	}
 53}
 54
 55func DrawWidgetWindow(x, y, w, h int) {
 56	for i := 0; i < ScreenCount; i++ {
 57		DrawVerticalLine(x, y+1, h-2, 1)
 58		DrawVerticalLine(x+w, y+1, h-2, 1)
 59		DrawHorizontalLine(x+1, y, w-2, 1)
 60		DrawHorizontalLine(x+1, y+h, w-2, 1)
 61	}
 62}
 63
 64func AddTextAllDisplays(x int, y int, v int, label string) {
 65	col := color.Gray{uint8(255 * v)}
 66	for i := 0; i < ScreenCount; i++ {
 67		pixfont.DrawString(FrameBuffers[i], x-i*ScreenWidth, y, label, col)
 68	}
 69}
 70
 71func BlankScreen(v int) {
 72	for i := 0; i < ScreenCount; i++ {
 73		draw.Draw(FrameBuffers[i], FrameBuffers[i].Bounds(), &image.Uniform{color.Gray{uint8(255 * v)}}, image.ZP, draw.Src)
 74	}
 75}
 76
 77func PerformanceTrackerStart() {
 78	PerformanceTrackerTimer = time.Now().UTC().UnixNano()
 79}
 80
 81func PerformanceTrackerEnd() int64 {
 82	return time.Now().UTC().UnixNano() - PerformanceTrackerTimer
 83}
 84
 85func DrawSunsetIcon(x, y int) {
 86	DrawHorizontalLine(3+x, 0+y, 2, 1)
 87	DrawHorizontalLine(2+x, 1+y, 4, 1)
 88	DrawHorizontalLine(2+x, 2+y, 4, 1)
 89	DrawHorizontalLine(3+x, 3+y, 2, 1)
 90	DrawHorizontalLine(2+x, 5+y, 1, 1)
 91	DrawHorizontalLine(5+x, 5+y, 1, 1)
 92	DrawHorizontalLine(3+x, 6+y, 2, 1)
 93}
 94
 95func DrawSunriseIcon(x, y int) {
 96	DrawHorizontalLine(3+x, 0+y, 2, 1)
 97	DrawHorizontalLine(2+x, 1+y, 1, 1)
 98	DrawHorizontalLine(5+x, 1+y, 1, 1)
 99	DrawHorizontalLine(3+x, 3+y, 2, 1)
100	DrawHorizontalLine(2+x, 4+y, 4, 1)
101	DrawHorizontalLine(2+x, 5+y, 4, 1)
102	DrawHorizontalLine(3+x, 6+y, 2, 1)
103}
104
105func DrawPihonLogo() {
106	DrawHorizontalLine(113, 4, 8, 1)
107	DrawHorizontalLine(135, 4, 8, 1)
108	DrawHorizontalLine(110, 5, 14, 1)
109	DrawHorizontalLine(132, 5, 14, 1)
110	DrawHorizontalLine(108, 6, 3, 1)
111	DrawHorizontalLine(113, 6, 1, 1)
112	DrawHorizontalLine(121, 6, 1, 1)
113	DrawHorizontalLine(123, 6, 3, 1)
114	DrawHorizontalLine(130, 6, 3, 1)
115	DrawHorizontalLine(134, 6, 1, 1)
116	DrawHorizontalLine(142, 6, 1, 1)
117	DrawHorizontalLine(145, 6, 3, 1)
118	DrawHorizontalLine(108, 7, 1, 1)
119	DrawHorizontalLine(125, 7, 2, 1)
120	DrawHorizontalLine(129, 7, 2, 1)
121	DrawHorizontalLine(147, 7, 1, 1)
122	DrawHorizontalLine(108, 8, 2, 1)
123	DrawHorizontalLine(125, 8, 2, 1)
124	DrawHorizontalLine(129, 8, 2, 1)
125	DrawHorizontalLine(146, 8, 2, 1)
126	DrawHorizontalLine(108, 9, 1, 1)
127	DrawHorizontalLine(126, 9, 4, 1)
128	DrawHorizontalLine(141, 9, 1, 1)
129	DrawHorizontalLine(147, 9, 1, 1)
130	DrawHorizontalLine(108, 10, 2, 1)
131	DrawHorizontalLine(116, 10, 1, 1)
132	DrawHorizontalLine(126, 10, 4, 1)
133	DrawHorizontalLine(139, 10, 1, 1)
134	DrawHorizontalLine(146, 10, 2, 1)
135	DrawHorizontalLine(108, 11, 2, 1)
136	DrawHorizontalLine(118, 11, 2, 1)
137	DrawHorizontalLine(127, 11, 2, 1)
138	DrawHorizontalLine(136, 11, 2, 1)
139	DrawHorizontalLine(146, 11, 2, 1)
140	DrawHorizontalLine(109, 12, 2, 1)
141	DrawHorizontalLine(120, 12, 1, 1)
142	DrawHorizontalLine(127, 12, 2, 1)
143	DrawHorizontalLine(135, 12, 1, 1)
144	DrawHorizontalLine(145, 12, 2, 1)
145	DrawHorizontalLine(109, 13, 2, 1)
146	DrawHorizontalLine(121, 13, 2, 1)
147	DrawHorizontalLine(126, 13, 4, 1)
148	DrawHorizontalLine(133, 13, 2, 1)
149	DrawHorizontalLine(145, 13, 2, 1)
150	DrawHorizontalLine(110, 14, 2, 1)
151	DrawHorizontalLine(122, 14, 2, 1)
152	DrawHorizontalLine(126, 14, 4, 1)
153	DrawHorizontalLine(132, 14, 2, 1)
154	DrawHorizontalLine(144, 14, 2, 1)
155	DrawHorizontalLine(110, 15, 2, 1)
156	DrawHorizontalLine(124, 15, 8, 1)
157	DrawHorizontalLine(144, 15, 2, 1)
158	DrawHorizontalLine(111, 16, 3, 1)
159	DrawHorizontalLine(124, 16, 8, 1)
160	DrawHorizontalLine(142, 16, 3, 1)
161	DrawHorizontalLine(111, 17, 3, 1)
162	DrawHorizontalLine(123, 17, 10, 1)
163	DrawHorizontalLine(142, 17, 2, 1)
164	DrawHorizontalLine(113, 18, 2, 1)
165	DrawHorizontalLine(122, 18, 12, 1)
166	DrawHorizontalLine(141, 18, 2, 1)
167	DrawHorizontalLine(114, 19, 28, 1)
168	DrawHorizontalLine(114, 20, 11, 1)
169	DrawHorizontalLine(131, 20, 11, 1)
170	DrawHorizontalLine(113, 21, 3, 1)
171	DrawHorizontalLine(121, 21, 2, 1)
172	DrawHorizontalLine(133, 21, 2, 1)
173	DrawHorizontalLine(140, 21, 3, 1)
174	DrawHorizontalLine(112, 22, 2, 1)
175	DrawHorizontalLine(120, 22, 2, 1)
176	DrawHorizontalLine(134, 22, 2, 1)
177	DrawHorizontalLine(142, 22, 2, 1)
178	DrawHorizontalLine(111, 23, 3, 1)
179	DrawHorizontalLine(120, 23, 2, 1)
180	DrawHorizontalLine(134, 23, 2, 1)
181	DrawHorizontalLine(143, 23, 2, 1)
182	DrawHorizontalLine(111, 24, 2, 1)
183	DrawHorizontalLine(118, 24, 5, 1)
184	DrawHorizontalLine(134, 24, 3, 1)
185	DrawHorizontalLine(143, 24, 2, 1)
186	DrawHorizontalLine(110, 25, 2, 1)
187	DrawHorizontalLine(117, 25, 7, 1)
188	DrawHorizontalLine(132, 25, 7, 1)
189	DrawHorizontalLine(144, 25, 2, 1)
190	DrawHorizontalLine(110, 26, 2, 1)
191	DrawHorizontalLine(116, 26, 24, 1)
192	DrawHorizontalLine(144, 26, 2, 1)
193	DrawHorizontalLine(110, 27, 2, 1)
194	DrawHorizontalLine(115, 27, 4, 1)
195	DrawHorizontalLine(124, 27, 8, 1)
196	DrawHorizontalLine(138, 27, 3, 1)
197	DrawHorizontalLine(144, 27, 2, 1)
198	DrawHorizontalLine(110, 28, 2, 1)
199	DrawHorizontalLine(113, 28, 4, 1)
200	DrawHorizontalLine(125, 28, 6, 1)
201	DrawHorizontalLine(139, 28, 4, 1)
202	DrawHorizontalLine(144, 28, 2, 1)
203	DrawHorizontalLine(109, 29, 7, 1)
204	DrawHorizontalLine(140, 29, 7, 1)
205	DrawHorizontalLine(108, 30, 8, 1)
206	DrawHorizontalLine(127, 30, 2, 1)
207	DrawHorizontalLine(141, 30, 3, 1)
208	DrawHorizontalLine(145, 30, 3, 1)
209	DrawHorizontalLine(107, 31, 3, 1)
210	DrawHorizontalLine(112, 31, 3, 1)
211	DrawHorizontalLine(127, 31, 2, 1)
212	DrawHorizontalLine(141, 31, 2, 1)
213	DrawHorizontalLine(146, 31, 3, 1)
214	DrawHorizontalLine(107, 32, 2, 1)
215	DrawHorizontalLine(113, 32, 2, 1)
216	DrawHorizontalLine(127, 32, 2, 1)
217	DrawHorizontalLine(141, 32, 2, 1)
218	DrawHorizontalLine(147, 32, 2, 1)
219	DrawHorizontalLine(106, 33, 2, 1)
220	DrawHorizontalLine(113, 33, 1, 1)
221	DrawHorizontalLine(122, 33, 12, 1)
222	DrawHorizontalLine(142, 33, 1, 1)
223	DrawHorizontalLine(148, 33, 2, 1)
224	DrawHorizontalLine(106, 34, 2, 1)
225	DrawHorizontalLine(113, 34, 1, 1)
226	DrawHorizontalLine(127, 34, 2, 1)
227	DrawHorizontalLine(142, 34, 1, 1)
228	DrawHorizontalLine(148, 34, 2, 1)
229	DrawHorizontalLine(106, 35, 2, 1)
230	DrawHorizontalLine(113, 35, 2, 1)
231	DrawHorizontalLine(126, 35, 4, 1)
232	DrawHorizontalLine(141, 35, 2, 1)
233	DrawHorizontalLine(148, 35, 2, 1)
234	DrawHorizontalLine(106, 36, 2, 1)
235	DrawHorizontalLine(112, 36, 3, 1)
236	DrawHorizontalLine(125, 36, 6, 1)
237	DrawHorizontalLine(141, 36, 3, 1)
238	DrawHorizontalLine(148, 36, 2, 1)
239	DrawHorizontalLine(106, 37, 2, 1)
240	DrawHorizontalLine(112, 37, 3, 1)
241	DrawHorizontalLine(124, 37, 2, 1)
242	DrawHorizontalLine(127, 37, 2, 1)
243	DrawHorizontalLine(130, 37, 2, 1)
244	DrawHorizontalLine(141, 37, 3, 1)
245	DrawHorizontalLine(148, 37, 2, 1)
246	DrawHorizontalLine(106, 38, 2, 1)
247	DrawHorizontalLine(112, 38, 4, 1)
248	DrawHorizontalLine(123, 38, 2, 1)
249	DrawHorizontalLine(127, 38, 2, 1)
250	DrawHorizontalLine(131, 38, 2, 1)
251	DrawHorizontalLine(140, 38, 4, 1)
252	DrawHorizontalLine(148, 38, 2, 1)
253	DrawHorizontalLine(106, 39, 2, 1)
254	DrawHorizontalLine(112, 39, 6, 1)
255	DrawHorizontalLine(122, 39, 2, 1)
256	DrawHorizontalLine(125, 39, 6, 1)
257	DrawHorizontalLine(132, 39, 2, 1)
258	DrawHorizontalLine(137, 39, 7, 1)
259	DrawHorizontalLine(147, 39, 3, 1)
260	DrawHorizontalLine(107, 40, 2, 1)
261	DrawHorizontalLine(111, 40, 10, 1)
262	DrawHorizontalLine(122, 40, 1, 1)
263	DrawHorizontalLine(127, 40, 2, 1)
264	DrawHorizontalLine(133, 40, 1, 1)
265	DrawHorizontalLine(135, 40, 10, 1)
266	DrawHorizontalLine(147, 40, 2, 1)
267	DrawHorizontalLine(107, 41, 14, 1)
268	DrawHorizontalLine(127, 41, 2, 1)
269	DrawHorizontalLine(135, 41, 5, 1)
270	DrawHorizontalLine(144, 41, 5, 1)
271	DrawHorizontalLine(108, 42, 4, 1)
272	DrawHorizontalLine(116, 42, 6, 1)
273	DrawHorizontalLine(127, 42, 2, 1)
274	DrawHorizontalLine(134, 42, 5, 1)
275	DrawHorizontalLine(144, 42, 4, 1)
276	DrawHorizontalLine(108, 43, 3, 1)
277	DrawHorizontalLine(117, 43, 5, 1)
278	DrawHorizontalLine(134, 43, 4, 1)
279	DrawHorizontalLine(145, 43, 3, 1)
280	DrawHorizontalLine(108, 44, 3, 1)
281	DrawHorizontalLine(118, 44, 4, 1)
282	DrawHorizontalLine(134, 44, 3, 1)
283	DrawHorizontalLine(145, 44, 2, 1)
284	DrawHorizontalLine(109, 45, 2, 1)
285	DrawHorizontalLine(119, 45, 3, 1)
286	DrawHorizontalLine(134, 45, 2, 1)
287	DrawHorizontalLine(145, 45, 2, 1)
288	DrawHorizontalLine(109, 46, 2, 1)
289	DrawHorizontalLine(120, 46, 2, 1)
290	DrawHorizontalLine(134, 46, 2, 1)
291	DrawHorizontalLine(145, 46, 2, 1)
292	DrawHorizontalLine(109, 47, 2, 1)
293	DrawHorizontalLine(120, 47, 2, 1)
294	DrawHorizontalLine(134, 47, 1, 1)
295	DrawHorizontalLine(145, 47, 2, 1)
296	DrawHorizontalLine(110, 48, 2, 1)
297	DrawHorizontalLine(120, 48, 3, 1)
298	DrawHorizontalLine(133, 48, 2, 1)
299	DrawHorizontalLine(144, 48, 2, 1)
300	DrawHorizontalLine(110, 49, 3, 1)
301	DrawHorizontalLine(121, 49, 3, 1)
302	DrawHorizontalLine(132, 49, 3, 1)
303	DrawHorizontalLine(143, 49, 3, 1)
304	DrawHorizontalLine(111, 50, 2, 1)
305	DrawHorizontalLine(121, 50, 14, 1)
306	DrawHorizontalLine(143, 50, 2, 1)
307	DrawHorizontalLine(112, 51, 3, 1)
308	DrawHorizontalLine(120, 51, 15, 1)
309	DrawHorizontalLine(141, 51, 3, 1)
310	DrawHorizontalLine(113, 52, 4, 1)
311	DrawHorizontalLine(119, 52, 7, 1)
312	DrawHorizontalLine(131, 52, 5, 1)
313	DrawHorizontalLine(139, 52, 4, 1)
314	DrawHorizontalLine(114, 53, 9, 1)
315	DrawHorizontalLine(134, 53, 7, 1)
316	DrawHorizontalLine(116, 54, 6, 1)
317	DrawHorizontalLine(134, 54, 6, 1)
318	DrawHorizontalLine(118, 55, 4, 1)
319	DrawHorizontalLine(134, 55, 4, 1)
320	DrawHorizontalLine(120, 56, 3, 1)
321	DrawHorizontalLine(133, 56, 3, 1)
322	DrawHorizontalLine(121, 57, 4, 1)
323	DrawHorizontalLine(131, 57, 3, 1)
324	DrawHorizontalLine(123, 58, 10, 1)
325	DrawHorizontalLine(125, 59, 6, 1)
326}
327
328func DrawLightningIcon() {
329	DrawHorizontalLine(253, 1, 1, 1)
330	DrawHorizontalLine(252, 2, 1, 1)
331	DrawHorizontalLine(251, 3, 2, 1)
332	DrawHorizontalLine(250, 4, 5, 1)
333	DrawHorizontalLine(249, 5, 5, 1)
334	DrawHorizontalLine(251, 6, 2, 1)
335	DrawHorizontalLine(251, 7, 1, 1)
336	DrawHorizontalLine(250, 8, 1, 1)
337}
338
339func DrawWifiEnabledIcon() {
340	DrawHorizontalLine(239, 1, 8, 1)
341	DrawHorizontalLine(238, 2, 1, 1)
342	DrawHorizontalLine(247, 2, 1, 1)
343	DrawHorizontalLine(240, 3, 6, 1)
344	DrawHorizontalLine(239, 4, 1, 1)
345	DrawHorizontalLine(246, 4, 1, 1)
346	DrawHorizontalLine(241, 5, 4, 1)
347	DrawHorizontalLine(240, 6, 1, 1)
348	DrawHorizontalLine(245, 6, 1, 1)
349	DrawHorizontalLine(242, 7, 2, 1)
350	DrawHorizontalLine(242, 8, 2, 1)
351}
352
353func DrawWifiDisabledIcon() {
354	DrawHorizontalLine(239, 1, 8, 1)
355	DrawHorizontalLine(238, 2, 1, 1)
356	DrawHorizontalLine(245, 2, 1, 1)
357	DrawHorizontalLine(247, 2, 1, 1)
358	DrawHorizontalLine(240, 3, 6, 1)
359	DrawHorizontalLine(239, 4, 1, 1)
360	DrawHorizontalLine(243, 4, 1, 1)
361	DrawHorizontalLine(246, 4, 1, 1)
362	DrawHorizontalLine(241, 5, 4, 1)
363	DrawHorizontalLine(240, 6, 2, 1)
364	DrawHorizontalLine(245, 6, 1, 1)
365	DrawHorizontalLine(240, 7, 1, 1)
366	DrawHorizontalLine(242, 7, 2, 1)
367	DrawHorizontalLine(239, 8, 1, 1)
368	DrawHorizontalLine(242, 8, 2, 1)
369}
370
371func UpdateFrameBuffersToFiles(frameBuffer *image.Gray, bufferIndex int, sequenceIndex int) {
372	f, _ := os.Create("./virtual-screens/" + fmt.Sprintf("%04d", sequenceIndex) + "." + strconv.Itoa(bufferIndex) + "img.png")
373	png.Encode(f, frameBuffer)
374}