inky_frame/frame/
color.rs

1// Permission is hereby granted, free of charge, to any person obtaining a copy
2// of this software and associated documentation files (the "Software"), to deal
3// in the Software without restriction, including without limitation the rights
4// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
5// copies of the Software, and to permit persons to whom the Software is
6// furnished to do so, subject to the following conditions:
7//
8// The above copyright notice and this permission notice shall be included in
9// all copies or substantial portions of the Software.
10//
11// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
14// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
15// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17// SOFTWARE.
18//
19
20#![no_implicit_prelude]
21
22extern crate core;
23
24use core::clone::Clone;
25use core::cmp::{Eq, PartialEq};
26use core::convert::From;
27use core::f32;
28use core::intrinsics::floorf32;
29use core::marker::Copy;
30
31static PATTERN: [u8; 0x10] = [
32    0x0, 0x8, 0x2, 0xA, 0xC, 0x4, 0xE, 0x6, 0x3, 0xB, 0x1, 0x9, 0xF, 0x7, 0xD, 0x5,
33];
34static MAP: [[u8; 16]; 0x200] = [
35    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
36    [3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
37    [3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
38    [3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0],
39    [3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0],
40    [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0],
41    [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0],
42    [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
43    [2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
44    [2, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
45    [2, 2, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0],
46    [2, 2, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0],
47    [2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0],
48    [2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0],
49    [2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
50    [7, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
51    [2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
52    [2, 2, 2, 2, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0],
53    [7, 2, 2, 2, 2, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0],
54    [2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0],
55    [2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0],
56    [2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
57    [7, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
58    [1, 1, 7, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
59    [2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0],
60    [2, 2, 2, 2, 2, 2, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0],
61    [2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 0, 0, 0, 0, 0],
62    [7, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 0, 0, 0],
63    [2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3],
64    [7, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
65    [1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
66    [1, 1, 1, 1, 7, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
67    [2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0],
68    [2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 0, 0, 0, 0, 0],
69    [2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 0, 0],
70    [2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3],
71    [1, 7, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3],
72    [1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3],
73    [1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3],
74    [1, 1, 1, 1, 1, 1, 5, 2, 4, 3, 3, 3, 3, 3, 3, 3],
75    [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0],
76    [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 0, 0, 0],
77    [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3],
78    [7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3],
79    [1, 1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3],
80    [1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3],
81    [1, 1, 1, 1, 1, 7, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3],
82    [1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 3, 3, 3, 3, 3],
83    [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0],
84    [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3],
85    [7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3],
86    [1, 1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3],
87    [1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3],
88    [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 6, 4, 3, 3, 3],
89    [1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 3, 3, 3, 3, 0],
90    [1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 7, 2, 2, 2, 3, 3],
91    [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
92    [1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
93    [1, 1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3],
94    [1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3],
95    [1, 1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 2, 6, 4, 4, 3],
96    [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 4, 4, 3, 3],
97    [1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 7, 2, 2, 3, 0, 0],
98    [1, 1, 1, 1, 1, 5, 5, 7, 7, 7, 2, 2, 6, 6, 6, 3],
99    [4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
100    [4, 4, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
101    [4, 4, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0],
102    [4, 4, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0],
103    [4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0],
104    [4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0],
105    [4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
106    [7, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
107    [2, 2, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
108    [7, 7, 2, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
109    [2, 2, 6, 4, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0],
110    [2, 2, 6, 4, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0],
111    [7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0],
112    [7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0],
113    [7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0],
114    [7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
115    [2, 2, 2, 2, 2, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0],
116    [2, 2, 2, 2, 2, 4, 4, 3, 3, 0, 0, 0, 0, 0, 0, 0],
117    [7, 7, 7, 2, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0],
118    [7, 7, 2, 2, 2, 4, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0],
119    [2, 2, 2, 2, 2, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3],
120    [7, 7, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0],
121    [7, 7, 7, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
122    [1, 1, 7, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
123    [2, 2, 2, 2, 2, 2, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0],
124    [7, 7, 2, 2, 2, 2, 2, 6, 3, 0, 0, 0, 0, 0, 0, 0],
125    [7, 7, 7, 2, 2, 2, 2, 2, 3, 3, 0, 0, 0, 0, 0, 0],
126    [7, 7, 7, 2, 2, 2, 2, 2, 3, 3, 3, 3, 0, 0, 0, 0],
127    [7, 7, 7, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 0, 0],
128    [7, 7, 7, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3],
129    [1, 1, 7, 7, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3],
130    [1, 1, 1, 7, 7, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
131    [5, 2, 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 0, 0],
132    [7, 7, 2, 2, 2, 2, 2, 2, 2, 6, 3, 0, 0, 0, 0, 0],
133    [7, 2, 2, 2, 2, 2, 2, 2, 2, 6, 3, 3, 3, 3, 0, 0],
134    [7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 0],
135    [1, 1, 7, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 0],
136    [1, 1, 1, 7, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3],
137    [1, 1, 1, 1, 7, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3],
138    [1, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3],
139    [5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0],
140    [5, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 0, 0],
141    [7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 0, 0],
142    [7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3],
143    [1, 1, 1, 7, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3],
144    [1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3],
145    [1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 3, 3, 3, 3, 3, 3],
146    [1, 1, 1, 1, 1, 1, 1, 7, 7, 2, 3, 3, 3, 3, 3, 0],
147    [5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 0, 0],
148    [7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0],
149    [7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3],
150    [1, 1, 1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3],
151    [1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3],
152    [1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 2, 3, 3, 3],
153    [1, 1, 1, 1, 1, 1, 1, 7, 7, 2, 2, 2, 6, 3, 3, 3],
154    [1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 3, 3, 3],
155    [5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
156    [1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
157    [1, 1, 1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
158    [1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3],
159    [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3],
160    [1, 1, 1, 1, 1, 1, 1, 1, 5, 2, 2, 2, 2, 2, 4, 3],
161    [1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 6, 6, 4, 3],
162    [1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 7, 2, 3, 3],
163    [4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
164    [4, 4, 4, 4, 4, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0],
165    [4, 4, 4, 4, 4, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0],
166    [4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0],
167    [4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0],
168    [4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
169    [7, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
170    [7, 7, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
171    [6, 6, 6, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
172    [6, 6, 6, 6, 4, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0],
173    [7, 7, 6, 6, 4, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0],
174    [7, 7, 7, 4, 4, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0],
175    [6, 6, 6, 6, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0],
176    [6, 6, 6, 6, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
177    [7, 7, 7, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
178    [7, 7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
179    [2, 2, 2, 2, 6, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0],
180    [7, 7, 7, 2, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
181    [7, 7, 7, 7, 2, 2, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0],
182    [7, 7, 7, 7, 2, 6, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0],
183    [7, 7, 7, 2, 2, 6, 4, 3, 3, 3, 3, 3, 3, 3, 0, 0],
184    [7, 7, 7, 7, 7, 2, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0],
185    [7, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0],
186    [1, 1, 7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
187    [5, 2, 2, 2, 2, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0],
188    [5, 2, 2, 2, 2, 6, 6, 6, 6, 3, 3, 0, 0, 0, 0, 0],
189    [7, 7, 7, 7, 2, 2, 2, 2, 6, 3, 0, 0, 0, 0, 0, 0],
190    [7, 2, 2, 2, 2, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 0],
191    [7, 7, 7, 7, 7, 2, 2, 2, 3, 3, 3, 3, 3, 0, 0, 0],
192    [7, 7, 7, 7, 7, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 0],
193    [1, 1, 7, 7, 7, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3],
194    [1, 1, 1, 1, 7, 7, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3],
195    [2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 4, 0, 0, 0, 0],
196    [2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 4, 3, 3, 0, 0],
197    [7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 4, 3, 0, 0, 0, 0],
198    [5, 7, 7, 7, 7, 2, 2, 2, 2, 2, 3, 3, 3, 3, 0, 0],
199    [7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 3, 3, 3, 3, 0],
200    [1, 1, 7, 7, 7, 7, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3],
201    [1, 1, 1, 1, 1, 7, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3],
202    [1, 1, 1, 1, 1, 1, 7, 2, 3, 3, 3, 3, 3, 3, 3, 3],
203    [5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0],
204    [5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 6, 3, 3, 0, 0],
205    [7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0],
206    [1, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 3, 3, 0],
207    [1, 1, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3],
208    [1, 1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3],
209    [1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 3, 3, 3, 3, 3, 3],
210    [1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 3, 3, 3, 3, 3, 3],
211    [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6],
212    [7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6],
213    [1, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0],
214    [1, 1, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3],
215    [1, 1, 1, 1, 7, 7, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3],
216    [1, 1, 1, 1, 1, 1, 7, 7, 2, 2, 2, 2, 2, 3, 3, 3],
217    [1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 3, 3, 3],
218    [1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 2, 2, 3, 3, 3],
219    [5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
220    [1, 5, 5, 5, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
221    [1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
222    [1, 1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
223    [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3],
224    [1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 2, 3],
225    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 3, 0],
226    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 2, 2, 2, 3],
227    [4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0],
228    [4, 4, 4, 4, 4, 4, 4, 3, 3, 0, 0, 0, 0, 0, 0, 0],
229    [4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 0, 0, 0, 0, 0],
230    [4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 0, 0, 0],
231    [4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3],
232    [7, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
233    [7, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
234    [1, 7, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
235    [6, 6, 6, 6, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0],
236    [6, 6, 6, 6, 4, 4, 4, 3, 3, 0, 0, 0, 0, 0, 0, 0],
237    [7, 7, 7, 6, 4, 4, 4, 3, 3, 0, 0, 0, 0, 0, 0, 0],
238    [7, 7, 7, 6, 4, 4, 4, 3, 3, 3, 3, 0, 0, 0, 0, 0],
239    [7, 7, 7, 6, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 0, 0],
240    [7, 7, 7, 6, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3],
241    [7, 7, 7, 7, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3],
242    [7, 7, 7, 7, 7, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3],
243    [2, 2, 6, 6, 6, 6, 6, 4, 4, 0, 0, 0, 0, 0, 0, 0],
244    [7, 7, 2, 6, 6, 6, 6, 4, 3, 0, 0, 0, 0, 0, 0, 0],
245    [7, 7, 7, 6, 6, 6, 6, 3, 3, 0, 0, 0, 0, 0, 0, 0],
246    [7, 7, 7, 7, 7, 7, 6, 4, 3, 3, 0, 0, 0, 0, 0, 0],
247    [7, 7, 7, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 0, 0],
248    [7, 7, 7, 7, 7, 7, 7, 4, 3, 3, 3, 3, 3, 3, 0, 0],
249    [7, 7, 7, 7, 7, 7, 7, 4, 3, 3, 3, 3, 3, 3, 3, 3],
250    [7, 7, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3],
251    [2, 2, 2, 2, 2, 6, 6, 6, 6, 4, 4, 4, 0, 0, 0, 0],
252    [5, 7, 7, 2, 2, 2, 6, 6, 4, 4, 3, 0, 0, 0, 0, 0],
253    [2, 2, 2, 2, 6, 6, 6, 6, 6, 4, 4, 3, 3, 3, 3, 3],
254    [5, 7, 7, 7, 7, 7, 7, 2, 6, 3, 3, 0, 0, 0, 0, 0],
255    [7, 7, 7, 7, 7, 7, 7, 2, 6, 3, 3, 3, 3, 0, 0, 0],
256    [7, 7, 7, 7, 7, 7, 7, 2, 6, 3, 3, 3, 3, 3, 3, 0],
257    [1, 7, 7, 7, 7, 7, 7, 7, 2, 3, 3, 3, 3, 3, 3, 3],
258    [1, 1, 1, 1, 7, 7, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3],
259    [5, 5, 5, 2, 2, 2, 2, 6, 6, 6, 6, 0, 0, 0, 0, 0],
260    [7, 7, 7, 2, 2, 2, 2, 2, 2, 6, 6, 6, 4, 0, 0, 0],
261    [5, 7, 7, 7, 7, 7, 2, 2, 2, 2, 6, 4, 3, 0, 0, 0],
262    [5, 5, 7, 7, 7, 7, 7, 7, 2, 2, 2, 3, 3, 0, 0, 0],
263    [1, 1, 7, 7, 7, 7, 7, 2, 2, 2, 6, 3, 3, 3, 0, 0],
264    [1, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 3, 3, 3, 3, 3],
265    [1, 1, 1, 1, 1, 7, 7, 7, 2, 2, 3, 3, 3, 3, 3, 3],
266    [1, 1, 1, 1, 1, 1, 1, 7, 2, 3, 3, 3, 3, 3, 3, 3],
267    [5, 5, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 0, 0],
268    [5, 5, 7, 7, 7, 2, 2, 2, 2, 2, 2, 6, 6, 0, 0, 0],
269    [5, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 6, 4, 3, 0],
270    [1, 1, 1, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 0, 0, 0],
271    [1, 5, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 3, 3, 3],
272    [1, 1, 1, 1, 7, 7, 7, 7, 2, 2, 2, 2, 3, 3, 3, 3],
273    [1, 1, 1, 1, 1, 1, 7, 7, 2, 2, 2, 3, 3, 3, 3, 3],
274    [1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 3, 3, 3, 3, 3],
275    [5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6],
276    [5, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6],
277    [5, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 6],
278    [7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2],
279    [1, 1, 1, 1, 1, 7, 7, 2, 2, 2, 2, 2, 2, 2, 3, 3],
280    [1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 3, 3, 3],
281    [1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 2, 2, 2, 3, 3, 3],
282    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 3, 3, 3],
283    [5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2],
284    [1, 5, 5, 5, 5, 5, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2],
285    [1, 1, 1, 1, 5, 5, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2],
286    [1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2],
287    [1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 2, 2, 2],
288    [1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 2, 3],
289    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 3],
290    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 3],
291    [4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0],
292    [4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 0, 0, 0, 0, 0],
293    [4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 0, 0],
294    [4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3],
295    [7, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3],
296    [7, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3],
297    [1, 7, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3],
298    [1, 7, 7, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3],
299    [6, 6, 6, 6, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0],
300    [6, 6, 6, 6, 4, 4, 4, 4, 4, 3, 3, 0, 0, 0, 0, 0],
301    [7, 7, 7, 6, 4, 4, 4, 4, 4, 4, 3, 3, 0, 0, 0, 0],
302    [7, 6, 6, 6, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 0],
303    [7, 7, 7, 6, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3],
304    [7, 7, 7, 6, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3],
305    [7, 7, 7, 7, 7, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3],
306    [1, 7, 7, 7, 7, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3],
307    [6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0],
308    [6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 0, 0, 0, 0, 0],
309    [6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 0, 0],
310    [6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3],
311    [7, 7, 7, 7, 7, 6, 6, 6, 4, 4, 3, 3, 3, 3, 3, 0],
312    [7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 3, 3, 3, 3, 3, 3],
313    [7, 7, 7, 7, 7, 7, 7, 4, 4, 3, 3, 3, 3, 3, 3, 3],
314    [1, 7, 7, 7, 7, 7, 7, 4, 4, 3, 3, 3, 3, 3, 3, 3],
315    [5, 5, 5, 5, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0],
316    [5, 5, 7, 7, 7, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0],
317    [5, 7, 7, 7, 7, 7, 2, 6, 6, 6, 4, 3, 0, 0, 0, 0],
318    [5, 7, 7, 7, 7, 7, 7, 6, 6, 6, 3, 3, 0, 0, 0, 0],
319    [7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 3, 3, 3, 3, 0, 0],
320    [7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 3, 3, 3, 3, 3, 3],
321    [7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 3, 3, 3, 3, 3, 3],
322    [1, 1, 1, 7, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 3, 3],
323    [2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 4, 4, 4, 4],
324    [5, 5, 5, 7, 7, 7, 2, 2, 2, 6, 6, 4, 4, 0, 0, 0],
325    [5, 7, 7, 7, 7, 7, 2, 2, 2, 6, 6, 6, 4, 0, 0, 0],
326    [5, 5, 5, 7, 7, 7, 7, 7, 7, 2, 6, 3, 3, 0, 0, 0],
327    [1, 1, 1, 7, 7, 7, 7, 7, 7, 2, 6, 3, 0, 0, 0, 0],
328    [1, 1, 1, 5, 7, 7, 7, 7, 7, 7, 2, 3, 3, 3, 3, 0],
329    [1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 2, 3, 3, 3, 3, 3],
330    [1, 1, 1, 1, 1, 1, 1, 7, 7, 7, 3, 3, 3, 3, 3, 3],
331    [2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6],
332    [7, 7, 7, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6],
333    [1, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 6, 6, 6, 6, 0],
334    [1, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 6, 6, 0, 0],
335    [1, 1, 5, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 3, 3, 0],
336    [1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 3, 3, 3],
337    [1, 1, 1, 1, 1, 1, 1, 7, 7, 7, 2, 2, 3, 3, 3, 3],
338    [1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 3, 3, 3, 3, 3],
339    [5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6],
340    [5, 5, 5, 5, 7, 7, 7, 2, 2, 2, 2, 2, 2, 6, 6, 6],
341    [1, 5, 5, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 6, 6],
342    [1, 5, 5, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2],
343    [1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2],
344    [1, 1, 1, 1, 1, 1, 7, 7, 7, 7, 2, 2, 2, 2, 3, 3],
345    [1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 2, 2, 2, 3, 3],
346    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 2, 3, 3, 3],
347    [5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2],
348    [1, 1, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2],
349    [1, 1, 1, 1, 5, 5, 5, 5, 7, 2, 2, 2, 2, 2, 2, 2],
350    [1, 1, 1, 1, 1, 1, 5, 5, 7, 2, 2, 2, 2, 2, 2, 2],
351    [1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 2, 2, 2, 2],
352    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 2, 2],
353    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3],
354    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 3],
355    [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0],
356    [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 0, 0, 0],
357    [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3],
358    [7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3],
359    [7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3],
360    [7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3],
361    [1, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3],
362    [1, 1, 7, 2, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3],
363    [6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0],
364    [6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 3, 3, 0, 0, 0],
365    [6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3],
366    [7, 7, 6, 6, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3],
367    [7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3],
368    [7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3],
369    [1, 1, 7, 7, 7, 6, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3],
370    [1, 1, 1, 7, 7, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3],
371    [6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 0, 0, 0, 0, 0],
372    [7, 7, 7, 6, 6, 6, 6, 6, 4, 4, 4, 4, 0, 0, 0, 0],
373    [7, 7, 7, 7, 6, 6, 6, 4, 4, 4, 4, 4, 3, 0, 0, 0],
374    [7, 7, 7, 7, 7, 6, 6, 6, 4, 4, 4, 4, 3, 3, 3, 0],
375    [7, 7, 7, 7, 7, 7, 6, 4, 4, 4, 4, 4, 3, 3, 3, 3],
376    [7, 7, 7, 7, 7, 7, 7, 6, 4, 4, 4, 4, 3, 3, 3, 3],
377    [1, 1, 1, 7, 7, 7, 7, 4, 4, 4, 4, 3, 3, 3, 3, 3],
378    [1, 1, 1, 7, 7, 7, 7, 4, 4, 4, 4, 3, 3, 3, 3, 3],
379    [5, 5, 2, 2, 6, 6, 6, 6, 6, 4, 4, 4, 4, 0, 0, 0],
380    [5, 5, 7, 7, 7, 6, 6, 6, 6, 6, 4, 4, 0, 0, 0, 0],
381    [5, 7, 7, 7, 7, 7, 7, 6, 6, 6, 4, 4, 0, 0, 0, 0],
382    [5, 7, 7, 7, 7, 7, 7, 7, 6, 4, 4, 4, 3, 0, 0, 0],
383    [7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 4, 4, 3, 3, 3, 0],
384    [1, 7, 7, 7, 7, 7, 7, 7, 6, 6, 4, 4, 3, 3, 3, 3],
385    [1, 1, 1, 7, 7, 7, 7, 7, 7, 4, 4, 3, 3, 3, 3, 3],
386    [1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 4, 3, 3, 3, 3, 3],
387    [5, 5, 5, 5, 2, 2, 2, 6, 6, 6, 6, 6, 4, 4, 0, 0],
388    [5, 7, 7, 7, 2, 2, 2, 6, 6, 6, 6, 6, 6, 4, 4, 0],
389    [5, 7, 7, 7, 7, 7, 7, 2, 2, 6, 6, 6, 4, 4, 0, 0],
390    [5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 0, 0, 0],
391    [1, 5, 5, 7, 7, 7, 7, 7, 7, 7, 6, 6, 3, 3, 3, 0],
392    [1, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 3, 3, 3],
393    [1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 3],
394    [1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 3, 3],
395    [5, 5, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6],
396    [5, 5, 7, 7, 7, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6],
397    [5, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 6, 6, 6, 6, 6],
398    [7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 6, 6, 6, 6],
399    [7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 6, 6],
400    [1, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 3, 3],
401    [1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 2, 3, 3],
402    [1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 7, 3, 3, 3, 3],
403    [5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 6, 6, 6, 6],
404    [5, 5, 5, 5, 5, 5, 7, 7, 7, 2, 2, 2, 2, 6, 6, 6],
405    [1, 5, 5, 5, 5, 5, 7, 7, 7, 7, 2, 2, 2, 2, 6, 6],
406    [1, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2],
407    [1, 1, 1, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2],
408    [1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2],
409    [1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 7, 7, 2, 2, 3],
410    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 7, 3, 3],
411    [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2],
412    [1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 2, 2, 2, 2],
413    [1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 5, 7, 2, 2, 2, 2],
414    [1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 7, 2, 2, 2, 2],
415    [1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 7, 2, 2, 2, 2],
416    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2, 2],
417    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2, 2],
418    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 3],
419    [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0],
420    [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3],
421    [7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3],
422    [7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3],
423    [7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3],
424    [1, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3],
425    [1, 1, 7, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3],
426    [1, 1, 7, 2, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 0],
427    [6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0],
428    [6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3],
429    [7, 7, 7, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3],
430    [7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3],
431    [7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3],
432    [1, 1, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3],
433    [1, 1, 1, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3],
434    [1, 1, 1, 7, 7, 2, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3],
435    [6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 4, 0, 0],
436    [6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 4, 3, 3],
437    [7, 7, 7, 7, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 3, 0],
438    [7, 7, 7, 7, 7, 6, 6, 6, 4, 4, 4, 4, 4, 4, 3, 3],
439    [7, 7, 7, 7, 7, 7, 7, 6, 4, 4, 4, 4, 4, 4, 3, 3],
440    [1, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 3, 3],
441    [1, 1, 1, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 3, 3, 3],
442    [1, 1, 1, 1, 7, 7, 7, 7, 4, 4, 4, 4, 4, 3, 3, 3],
443    [6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0],
444    [6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3],
445    [7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 4, 4, 4, 3, 0],
446    [7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 4, 4, 4, 4, 4, 0],
447    [7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 4, 4, 4, 4, 3],
448    [1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 3, 3],
449    [1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 3, 3],
450    [1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 4, 4, 4, 3, 3, 3],
451    [2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6],
452    [5, 5, 7, 7, 7, 2, 6, 6, 6, 6, 6, 6, 6, 6, 4, 0],
453    [5, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 0],
454    [1, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 4, 0],
455    [1, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 4, 4, 3],
456    [1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 4, 4, 3],
457    [1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 3, 3],
458    [1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 3, 3],
459    [5, 5, 5, 5, 5, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6],
460    [5, 5, 5, 5, 7, 7, 7, 2, 2, 6, 6, 6, 6, 6, 6, 6],
461    [5, 5, 5, 7, 7, 7, 7, 7, 7, 2, 6, 6, 6, 6, 6, 6],
462    [5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 6, 6, 6, 6],
463    [5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 6, 6],
464    [5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7],
465    [1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7],
466    [1, 1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3],
467    [5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 6, 6, 6, 6, 6],
468    [1, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 2, 2, 6, 6, 6],
469    [1, 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 2, 2, 6, 6],
470    [1, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 2],
471    [1, 1, 1, 5, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 2],
472    [1, 1, 1, 1, 1, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 2],
473    [1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 2],
474    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 7, 3, 3],
475    [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2],
476    [1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 2, 2],
477    [1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 2, 2],
478    [1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 5, 7, 2, 2],
479    [1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 7, 2, 2],
480    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 7, 2, 2],
481    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2, 2],
482    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 2],
483    [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
484    [7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3],
485    [7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3],
486    [1, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3],
487    [1, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3],
488    [1, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3],
489    [1, 1, 1, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3],
490    [1, 1, 7, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 0],
491    [6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
492    [7, 7, 7, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
493    [7, 7, 7, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3],
494    [1, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3],
495    [1, 1, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3],
496    [1, 1, 1, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3],
497    [1, 1, 1, 1, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3],
498    [1, 1, 1, 7, 7, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 3],
499    [6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4],
500    [7, 7, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4],
501    [7, 7, 7, 7, 7, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4],
502    [7, 7, 7, 7, 7, 7, 7, 6, 4, 4, 4, 4, 4, 4, 4, 4],
503    [1, 7, 7, 7, 7, 7, 7, 6, 4, 4, 4, 4, 4, 4, 4, 4],
504    [1, 1, 1, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 3],
505    [1, 1, 1, 1, 1, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 3],
506    [1, 1, 1, 1, 1, 7, 7, 2, 4, 4, 4, 4, 4, 4, 4, 3],
507    [6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4],
508    [7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4],
509    [1, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 4],
510    [1, 1, 7, 7, 7, 7, 7, 7, 6, 6, 4, 4, 4, 4, 4, 4],
511    [1, 1, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4],
512    [1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4],
513    [1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 3],
514    [1, 1, 1, 1, 1, 1, 1, 7, 7, 7, 4, 4, 4, 4, 4, 3],
515    [5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6],
516    [5, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6],
517    [1, 5, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4],
518    [1, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 4],
519    [1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 6, 6, 4, 4, 4, 4],
520    [1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 4, 4, 4],
521    [1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4],
522    [1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4],
523    [5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6],
524    [5, 5, 5, 5, 5, 5, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6],
525    [1, 1, 5, 5, 5, 5, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6],
526    [1, 1, 1, 5, 5, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6],
527    [1, 1, 1, 1, 1, 1, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6],
528    [1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6],
529    [1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4],
530    [1, 1, 1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 4],
531    [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6],
532    [1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 6, 6, 6, 6],
533    [1, 1, 1, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7, 6, 6, 6],
534    [1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 7, 7, 7, 7, 6, 6],
535    [1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 7, 7, 7, 7, 6, 6],
536    [1, 1, 1, 1, 1, 1, 1, 5, 5, 7, 7, 7, 7, 7, 6, 6],
537    [1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 7, 7, 7, 7, 7, 7],
538    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 7, 7, 7, 7],
539    [5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
540    [1, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
541    [1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
542    [1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5],
543    [1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 5],
544    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5],
545    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5],
546    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
547];
548
549#[repr(u8)]
550pub enum Color {
551    Black  = 0x0,
552    White  = 0x1,
553    Green  = 0x2,
554    Blue   = 0x3,
555    Red    = 0x4,
556    Yellow = 0x5,
557    Orange = 0x6,
558    Clean  = 0x7,
559}
560
561pub struct RGB(u8, u8, u8);
562
563impl RGB {
564    #[inline(always)]
565    pub const fn empty() -> RGB {
566        RGB(0u8, 0u8, 0u8)
567    }
568    #[inline(always)]
569    pub const fn raw(c: u32) -> RGB {
570        RGB(
571            ((c >> 16) & 0xFF) as u8,
572            ((c >> 8) & 0xFF) as u8,
573            (c & 0xFF) as u8,
574        )
575    }
576    #[inline(always)]
577    pub const fn rgb(r: u8, b: u8, g: u8) -> RGB {
578        RGB(r, g, b)
579    }
580
581    pub fn hsv(h: f32, s: f32, v: f32) -> RGB {
582        let i = unsafe { floorf32(h * 6.0) };
583        let (f, y) = (h * 6.0 - i, v * 255.0);
584        let (p, q, t) = (
585            (y * (1.0 - s)) as u8,
586            (y * (1.0 - f * s)) as u8,
587            (y * (1.0 - (1.0 - f) * s)) as u8,
588        );
589        match i as u8 % 6 {
590            0 => RGB(y as u8, t, p),
591            1 => RGB(q, y as u8, p),
592            2 => RGB(p, y as u8, t),
593            3 => RGB(p, q, y as u8),
594            4 => RGB(t, p, y as u8),
595            5 => RGB(y as u8, p, q),
596            _ => RGB(0u8, 0u8, 0u8),
597        }
598    }
599
600    #[inline(always)]
601    pub fn red(&self) -> u8 {
602        self.0
603    }
604    #[inline(always)]
605    pub fn blue(&self) -> u8 {
606        self.2
607    }
608    #[inline(always)]
609    pub fn green(&self) -> u8 {
610        self.1
611    }
612    #[inline(always)]
613    pub fn uint(&self) -> u32 {
614        ((self.0 as u32) << 16) | ((self.1 as u32) << 8) | self.2 as u32
615    }
616}
617
618impl Eq for RGB {}
619impl Copy for RGB {}
620impl Clone for RGB {
621    #[inline(always)]
622    fn clone(&self) -> RGB {
623        RGB(self.0, self.1, self.2)
624    }
625}
626impl PartialEq for RGB {
627    #[inline(always)]
628    fn eq(&self, other: &RGB) -> bool {
629        self.0 == other.0 && self.1 == other.1 && self.2 == other.2
630    }
631}
632impl From<u32> for RGB {
633    #[inline(always)]
634    fn from(v: u32) -> RGB {
635        RGB::raw(v)
636    }
637}
638impl From<i32> for RGB {
639    #[inline(always)]
640    fn from(v: i32) -> RGB {
641        RGB::raw(v as u32)
642    }
643}
644impl From<(u8, u8, u8)> for RGB {
645    #[inline(always)]
646    fn from(v: (u8, u8, u8)) -> RGB {
647        RGB(v.0, v.1, v.2)
648    }
649}
650
651#[inline]
652pub(super) fn dither(x: u16, y: u16, c: u32) -> u8 {
653    let k = (((((c >> 16) & 0xFF) & 0xE0) << 1) | ((((c >> 8) & 0xFF) & 0xE0) >> 2) | (((c & 0xFF) & 0xE0) >> 5)) as usize;
654    let i = ((x & 0x3) | ((y & 0x3) << 2)) as usize;
655    MAP[k][PATTERN[i] as usize]
656}