mirror of
https://github.com/spice2x/spice2x.github.io.git
synced 2026-08-02 14:50:41 -07:00
Initial commit for GitHub migration based on spice2x-25-03-03
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
#include "tapeled.h"
|
||||
|
||||
namespace tapeledutils {
|
||||
|
||||
led_tape_color_pick_algorithm TAPE_LED_ALGORITHM = TAPE_LED_USE_MIDDLE;
|
||||
|
||||
bool is_enabled() {
|
||||
return (TAPE_LED_ALGORITHM != TAPE_LED_USE_NONE);
|
||||
}
|
||||
|
||||
// for bi2x-style byte array of all colors and LEDs at once
|
||||
rgb_float3_t pick_color_from_led_tape(uint8_t *data, size_t data_size) {
|
||||
rgb_float3_t result = {0.f, 0.f, 0.f};
|
||||
if (TAPE_LED_ALGORITHM == TAPE_LED_USE_AVERAGE) {
|
||||
|
||||
// calculate average color
|
||||
size_t avg_ri = 0;
|
||||
size_t avg_gi = 0;
|
||||
size_t avg_bi = 0;
|
||||
for (size_t i = 0; i < data_size; i++) {
|
||||
const auto color = &data[i * 3];
|
||||
avg_ri += color[0];
|
||||
avg_gi += color[1];
|
||||
avg_bi += color[2];
|
||||
}
|
||||
|
||||
// normalize
|
||||
const float avg_mult = 1.f / (data_size * 255);
|
||||
result.r = avg_ri * avg_mult;
|
||||
result.g = avg_gi * avg_mult;
|
||||
result.b = avg_bi * avg_mult;
|
||||
|
||||
} else if (TAPE_LED_ALGORITHM == TAPE_LED_USE_FIRST ||
|
||||
TAPE_LED_ALGORITHM == TAPE_LED_USE_MIDDLE ||
|
||||
TAPE_LED_ALGORITHM == TAPE_LED_USE_LAST ) {
|
||||
|
||||
// pick one LED
|
||||
const uint8_t *color;
|
||||
switch (TAPE_LED_ALGORITHM) {
|
||||
case TAPE_LED_USE_FIRST:
|
||||
color = &data[0];
|
||||
break;
|
||||
case TAPE_LED_USE_LAST:
|
||||
color = &data[(data_size - 1) * 3];
|
||||
break;
|
||||
case TAPE_LED_USE_MIDDLE:
|
||||
default:
|
||||
color = &data[(data_size / 2) * 3];
|
||||
break;
|
||||
}
|
||||
|
||||
// normalize
|
||||
const float single_mult = 1.f / 255;
|
||||
result.r = color[0] * single_mult;
|
||||
result.g = color[1] * single_mult;
|
||||
result.b = color[2] * single_mult;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// for bi2a-style that calls for each individual LED
|
||||
size_t get_led_index_using_avg_algo(size_t data_size) {
|
||||
size_t index_to_use;
|
||||
|
||||
if (TAPE_LED_ALGORITHM == TAPE_LED_USE_FIRST) {
|
||||
index_to_use = 0;
|
||||
} else if (TAPE_LED_ALGORITHM == TAPE_LED_USE_LAST) {
|
||||
index_to_use = data_size - 1;
|
||||
} else if (TAPE_LED_ALGORITHM == TAPE_LED_USE_MIDDLE) {
|
||||
index_to_use = (size_t)(data_size / 2);
|
||||
} else {
|
||||
// TAPE_LED_USE_AVERAGE can't work for this model since we don't cache the entire tape
|
||||
// LED array, so just use the middle-of-tape value instead
|
||||
index_to_use = (size_t)(data_size / 2);
|
||||
}
|
||||
|
||||
return index_to_use;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user