Optimize the lookup table for pixel distances

This commit is contained in:
Kuba Birecki 2022-01-18 22:47:11 +01:00
parent 19790f2e1a
commit 0e09446cf8

View file

@ -98,11 +98,18 @@ size_t zmk_animation_get_pixel_by_key_position(size_t key_position) {
/** /**
* Lookup table for distance between any two pixels. * Lookup table for distance between any two pixels.
*
* The values are stored as a triangular matrix which cuts the space requirement roughly in half.
*/ */
static uint8_t pixel_distance[DT_INST_PROP_LEN(0, pixels)][DT_INST_PROP_LEN(0, pixels)]; static uint8_t
pixel_distance[((DT_INST_PROP_LEN(0, pixels) + 1) * DT_INST_PROP_LEN(0, pixels)) / 2];
uint8_t zmk_animation_get_pixel_distance(size_t pixel_idx, size_t other_pixel_idx) { uint8_t zmk_animation_get_pixel_distance(size_t pixel_idx, size_t other_pixel_idx) {
return pixel_distance[pixel_idx][other_pixel_idx]; if (pixel_idx < other_pixel_idx) {
return zmk_animation_get_pixel_distance(other_pixel_idx, pixel_idx);
}
return pixel_distance[(((pixel_idx + 1) * pixel_idx) >> 1) + other_pixel_idx];
} }
#endif #endif
@ -152,13 +159,14 @@ void zmk_animation_request_frames(uint32_t frames) {
static int zmk_animation_init(const struct device *dev) { static int zmk_animation_init(const struct device *dev) {
#if defined(CONFIG_ZMK_ANIMATION_PIXEL_DISTANCE) && (CONFIG_ZMK_ANIMATION_PIXEL_DISTANCE == 1) #if defined(CONFIG_ZMK_ANIMATION_PIXEL_DISTANCE) && (CONFIG_ZMK_ANIMATION_PIXEL_DISTANCE == 1)
// Prefill the pixel distance lookup table // Prefill the pixel distance lookup table
int k = 0;
for (size_t i = 0; i < pixels_size; ++i) { for (size_t i = 0; i < pixels_size; ++i) {
for (size_t j = 0; j < pixels_size; ++j) { for (size_t j = 0; j <= i; ++j) {
// Distances are normalized to fit inside 0-255 range to fit inside uint8_t // Distances are normalized to fit inside 0-255 range to fit inside uint8_t
// for better space efficiency // for better space efficiency
pixel_distance[i][j] = sqrt(pow(pixels[i].position_x - pixels[j].position_x, 2) + pixel_distance[k++] = sqrt(pow(pixels[i].position_x - pixels[j].position_x, 2) +
pow(pixels[i].position_y - pixels[j].position_y, 2)) * pow(pixels[i].position_y - pixels[j].position_y, 2)) *
255 / 360; 255 / 360;
} }
} }
#endif #endif