Round display support (gabbro): round template variants and arc status #62
Labels
No labels
area:companion
area:docs
area:shared
area:tooling
area:watchapp
blocker
kind:chore
kind:feature
kind:spike
kind:test
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Depends on
#35 view_nav: turn arrow, countdown, street, then-turn, ETA
robert/PedalPebble
#42 view_map polyline renderer
robert/PedalPebble
#59 Page template renderer: HERO1, HERO2, QUAD, GRID6
robert/PedalPebble
Reference
robert/PedalPebble#62
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Goal
Make the Pebble Round 2 a device the app was designed for rather than tolerated on. 260x260 round, but a circle of that size inscribes only about 184x184 - so a screen with more total pixels than emery has less usable area for grids.
Acceptance criteria
HERO1centred with ~170 px digits - the template that suits a circle bestHERO2hero centred, the two cells inset to the chord width at their vertical positionQUADinset to the inscribed square, cells about 92x92GRID6falls back toQUADongabbro, as it does onbasaltgraphics_draw_arc()andgpoint_from_polar(), with glyphs placed radially - a straight strip has almost no width on a circleNAVcentred turn arrow with arc-aligned textMAPround-native: a heading-up centred map, which suits a circle better than a rectanglePBL_ROUND/PBL_IF_ROUND_ELSE(), never with runtime screen-size checkslayer_get_bounds()gbitmap_get_data_row_info()used wherever the framebuffer is touched directly; rows are shorter near the top and bottom of a round displaytext_layer_enable_screen_text_flow_and_paging()enabled for text that can overflow, so it follows the curve rather than clippinggabbroemulator and, where hardware allows, on deviceFiles
watchapp/src/c/page_render.cwatchapp/src/c/status_bar.cNotes
Rectangular layouts do NOT auto-adapt to round - the SDK's automatic scaling is chalk to gabbro, which is round to round. See docs/DESIGN.md section 3 and docs/DECISIONS.md D24.
Update — 2026-09-01: moved to Phase 1b, and the DPI figure was wrong
Moved to Phase 1b — Generalise the display (D32). Round support is not cancelled; it is better
designed after a few real rides on the rectangle than before the first one, and it was landing before
#4 had confirmed the transport the whole architecture depends on.
Correction: the Round 2 is ~200 DPI, not 283. 260 px across a 1.3″ diagonal is about 200 — the
same density as the Time 2 (200 × 228 over 1.5″ ≈ 202 DPI). See the D24 correction.
scale is needed — but
gabbrotext cannot be smaller in pixels either, because the density itwas credited with is not there
resources
QUAD's emphasised slot 1 (D29) works within the inscribed squareemery,gabbroorbasalt" as an assertion rather than a look in the emulatorPR #125 (
area/round-display-support) merged — but this issue depends on #35 and #42 (both still open, NAV/MAP round layouts), so Forgejo will correctly refuse to close it until those land. Leaving open with those edges in place (checked both for cycles before adding — no cycle, neither depends on #62).Everything buildable without a live NAV/MAP page is done for real:
page_render_content_rect_round()): the largest square inscribed in the circle, computed via an integer Newton's-method isqrt (no<math.h>, matching this file's existing no-float rule) rather than a hard-coded gabbro constant — correct for any future round screen size on day one. I independently re-derived this by hand (2×130²=33800, isqrt→184) and it matches the PR's own claimed 184×184 exactly.page_render_digit_height_round()) — composes for free.page_render_resolve_template()— a 92×61 cell now correctly fails its existing 100×69 threshold with no gabbro-specific code added to that function at all. Independently verified this arithmetic too.page_render_status_arc_slot()(pure, host-tested angular spans) plusgraphics_draw_arc()/gpoint_from_polar()/grect_centered_from_polar()inpage_render.c— checked every one of those calls against the actual installed Core Devices SDK 4.33.1 header before trusting them; all real, matching signatures.page_render_fit_digit_height_2d()(height-aware) with the original width-onlypage_render_fit_digit_height()now a thin wrapper — needed since round's tighter cells exposed real vertical overflow (HERO1's round 170px ceiling vs. a 164px value area) that the width-only check couldn't catch. Every existing #121 test still passes unmodified.gbitmap_get_data_row_info()genuinely has no call site — not a skipped criterion, a correctly-inapplicable one), and did not fabricate a temporary NAV/MAP page just to exercise those criteria.Real verification: genuine
pebble buildclean on all three targets, real gabbro/emery/basalt emulator screenshots, and 193/193 host assertions across all five test suites hand-compiled withgcc -Wall -Wextra -Werror(no cmake in this sandbox) — I re-ran every one of them myself, exact match to the PR's own claimed count.47 issues closed.