185 {
186
187
188
189
190
191
192
193
194 if (min_field < 1) {
195 min_field = 1;
196 }
197 if (min_field > 31) {
198 min_field = 31;
199 }
200 const u16 drives[3] = {r16, g16, b16};
201 u32 target[3];
202 u32 brightest = 0;
203 for (int i = 0; i < 3; ++i) {
204 target[i] = static_cast<u32>(
205 (
static_cast<u64>(drives[i]) * 7905u * 256u) / 65535u);
206 if (target[i] > brightest) {
207 brightest = target[i];
208 }
209 }
210
211 u32 field = brightest / 65408u + 1u;
212 if (field < min_field) {
213 field = min_field;
214 }
215 if (field > 31u) {
216 field = 31u;
217 }
218 const u32 unit = field * 256u;
219 for (int i = 0; i < 3; ++i) {
220 const u32 code = (target[i] + unit / 2u) / unit;
221 out->raw[i] =
static_cast<u8>(code > 255u ? 255u : code);
222 }
223 *out_field =
static_cast<u8>(field);
224}