Scroll speeds below 1 dot per second

scroll_speed is now a float (0.05-30 dots per second, e.g. 0.25 = one dot
every 4 s). Page format 5; version 4 pages are converted, version 3 goes
through version 4.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mangavalkandClaude Opus 5.5 committed 2026-10-16 16:23:16 +02:00
1 parent 1282d16c0b
commit e0a89cec99
17 files changed
+148 -21

No files matched your search

+29
View File
@@ -1401,6 +1401,34 @@ static bool anyDot(const uint8_t *b, int x0, int x1)
return false;
}
void test_slow_scrolling_below_one_dot_per_second()
{
FakeResources res;
DynamicPage page = scrollPage();
page.elements[0].scroll_speed = 0.25f; // a dot every 4 s
TEST_ASSERT_NULL(validatePage(page));
uint8_t a[BITMAP_BYTES], b[BITMAP_BYTES];
TEST_ASSERT_EQUAL(4000, renderPage(page, at(12, 0), 0, res, a));
TEST_ASSERT_EQUAL(1, renderPage(page, at(12, 0), 3999, res, b));
TEST_ASSERT_EQUAL(0, memcmp(a, b, BITMAP_BYTES)); // not moved yet
TEST_ASSERT_EQUAL(4000, renderPage(page, at(12, 0), 4000, res, b));
TEST_ASSERT_TRUE(memcmp(a, b, BITMAP_BYTES) != 0); // one dot on
TEST_ASSERT_EQUAL(1500, renderPage(page, at(12, 0), 6500, res, b));
page.elements[0].scroll_speed = 0.3f; // 3333.3 ms per dot: no drift over a long time
TEST_ASSERT_EQUAL(3334, renderPage(page, at(12, 0), 0, res, a));
uint32_t t = 3000000000UL; // ~35 days of millis()
uint32_t wait = renderPage(page, at(12, 0), t, res, a);
TEST_ASSERT_TRUE(wait >= 1 && wait <= 3334);
page.elements[0].scroll_speed = 0.01f; // too slow
TEST_ASSERT_NOT_NULL(validatePage(page));
page.elements[0].scroll_speed = NAN;
TEST_ASSERT_NOT_NULL(validatePage(page));
page.elements[0].scroll_speed = 31;
TEST_ASSERT_NOT_NULL(validatePage(page));
}
void test_scrolling_text_moves_in_its_window()
{
FakeResources res;
@@ -2297,6 +2325,7 @@ int main()
RUN_TEST(test_bar_render);
RUN_TEST(test_bar_validation);
RUN_TEST(test_plex_user_placeholder);
RUN_TEST(test_slow_scrolling_below_one_dot_per_second);
return UNITY_END();
}