@typecad/ui 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1443 -0
- package/dist/engine-index.d.ts +7 -0
- package/dist/engine-index.js +41 -0
- package/dist/index.d.ts +165 -0
- package/dist/index.js +42 -0
- package/dist/preview/build-program.d.ts +7 -0
- package/dist/preview/build-program.js +665 -0
- package/dist/preview/host-gfx.d.ts +90 -0
- package/dist/preview/host-gfx.js +552 -0
- package/dist/preview/host-ui-runtime.d.ts +241 -0
- package/dist/preview/host-ui-runtime.js +3236 -0
- package/dist/preview/types.d.ts +83 -0
- package/dist/preview/types.js +1 -0
- package/dist/types.d.ts +108 -0
- package/dist/types.js +10 -0
- package/dist/ui-engine/block-layout.d.ts +8 -0
- package/dist/ui-engine/block-layout.js +95 -0
- package/dist/ui-engine/color.d.ts +49 -0
- package/dist/ui-engine/color.js +273 -0
- package/dist/ui-engine/css-parser.d.ts +155 -0
- package/dist/ui-engine/css-parser.js +1058 -0
- package/dist/ui-engine/default-keyboards.d.ts +3 -0
- package/dist/ui-engine/default-keyboards.js +53 -0
- package/dist/ui-engine/easing.d.ts +12 -0
- package/dist/ui-engine/easing.js +76 -0
- package/dist/ui-engine/font-assets.d.ts +50 -0
- package/dist/ui-engine/font-assets.js +431 -0
- package/dist/ui-engine/html-parser.d.ts +116 -0
- package/dist/ui-engine/html-parser.js +284 -0
- package/dist/ui-engine/image-assets.d.ts +21 -0
- package/dist/ui-engine/image-assets.js +125 -0
- package/dist/ui-engine/inline-parser.d.ts +30 -0
- package/dist/ui-engine/inline-parser.js +66 -0
- package/dist/ui-engine/keyframes.d.ts +3 -0
- package/dist/ui-engine/keyframes.js +39 -0
- package/dist/ui-engine/layout-engine.d.ts +35 -0
- package/dist/ui-engine/layout-engine.js +203 -0
- package/dist/ui-engine/model.d.ts +239 -0
- package/dist/ui-engine/model.js +987 -0
- package/dist/ui-engine/rich-layout.d.ts +51 -0
- package/dist/ui-engine/rich-layout.js +220 -0
- package/dist/ui-engine/run-types.d.ts +13 -0
- package/dist/ui-engine/run-types.js +1 -0
- package/dist/ui-engine/runtime-header/antialiasing.d.ts +1 -0
- package/dist/ui-engine/runtime-header/antialiasing.js +141 -0
- package/dist/ui-engine/runtime-header/blend-bodies.d.ts +1 -0
- package/dist/ui-engine/runtime-header/blend-bodies.js +39 -0
- package/dist/ui-engine/runtime-header/canvas-helpers.d.ts +1 -0
- package/dist/ui-engine/runtime-header/canvas-helpers.js +155 -0
- package/dist/ui-engine/runtime-header/canvas-scrollbar.d.ts +1 -0
- package/dist/ui-engine/runtime-header/canvas-scrollbar.js +105 -0
- package/dist/ui-engine/runtime-header/color-mono-refresh.d.ts +1 -0
- package/dist/ui-engine/runtime-header/color-mono-refresh.js +154 -0
- package/dist/ui-engine/runtime-header/dirty-scroll-mutators.d.ts +1 -0
- package/dist/ui-engine/runtime-header/dirty-scroll-mutators.js +169 -0
- package/dist/ui-engine/runtime-header/display-shim.d.ts +1 -0
- package/dist/ui-engine/runtime-header/display-shim.js +104 -0
- package/dist/ui-engine/runtime-header/forward-decls.d.ts +1 -0
- package/dist/ui-engine/runtime-header/forward-decls.js +137 -0
- package/dist/ui-engine/runtime-header/guard-close.d.ts +1 -0
- package/dist/ui-engine/runtime-header/guard-close.js +8 -0
- package/dist/ui-engine/runtime-header/image-drawing.d.ts +1 -0
- package/dist/ui-engine/runtime-header/image-drawing.js +300 -0
- package/dist/ui-engine/runtime-header/init-press-input.d.ts +1 -0
- package/dist/ui-engine/runtime-header/init-press-input.js +126 -0
- package/dist/ui-engine/runtime-header/keyboard.d.ts +1 -0
- package/dist/ui-engine/runtime-header/keyboard.js +342 -0
- package/dist/ui-engine/runtime-header/node-decoration.d.ts +1 -0
- package/dist/ui-engine/runtime-header/node-decoration.js +212 -0
- package/dist/ui-engine/runtime-header/paint-order-coords.d.ts +1 -0
- package/dist/ui-engine/runtime-header/paint-order-coords.js +190 -0
- package/dist/ui-engine/runtime-header/paint-rects-repair.d.ts +1 -0
- package/dist/ui-engine/runtime-header/paint-rects-repair.js +553 -0
- package/dist/ui-engine/runtime-header/scroll-physics.d.ts +1 -0
- package/dist/ui-engine/runtime-header/scroll-physics.js +161 -0
- package/dist/ui-engine/runtime-header/state-bindings-nav.d.ts +1 -0
- package/dist/ui-engine/runtime-header/state-bindings-nav.js +176 -0
- package/dist/ui-engine/runtime-header/structs.d.ts +1 -0
- package/dist/ui-engine/runtime-header/structs.js +220 -0
- package/dist/ui-engine/runtime-header/text-rendering.d.ts +1 -0
- package/dist/ui-engine/runtime-header/text-rendering.js +715 -0
- package/dist/ui-engine/runtime-header/tick/bindings-phase.d.ts +1 -0
- package/dist/ui-engine/runtime-header/tick/bindings-phase.js +103 -0
- package/dist/ui-engine/runtime-header/tick/dirty-draw-phase.d.ts +1 -0
- package/dist/ui-engine/runtime-header/tick/dirty-draw-phase.js +1051 -0
- package/dist/ui-engine/runtime-header/tick/flush-phase.d.ts +1 -0
- package/dist/ui-engine/runtime-header/tick/flush-phase.js +17 -0
- package/dist/ui-engine/runtime-header/tick/scroll-canvas-phase.d.ts +1 -0
- package/dist/ui-engine/runtime-header/tick/scroll-canvas-phase.js +15 -0
- package/dist/ui-engine/runtime-header/tick/transitions-phase.d.ts +1 -0
- package/dist/ui-engine/runtime-header/tick/transitions-phase.js +213 -0
- package/dist/ui-engine/runtime-header/tick-motion-helpers.d.ts +1 -0
- package/dist/ui-engine/runtime-header/tick-motion-helpers.js +26 -0
- package/dist/ui-engine/runtime-header/tick.d.ts +1 -0
- package/dist/ui-engine/runtime-header/tick.js +17 -0
- package/dist/ui-engine/runtime-header/touch-keyboard-fwd.d.ts +1 -0
- package/dist/ui-engine/runtime-header/touch-keyboard-fwd.js +406 -0
- package/dist/ui-engine/runtime-header/types-defines.d.ts +1 -0
- package/dist/ui-engine/runtime-header/types-defines.js +79 -0
- package/dist/ui-engine/runtime-header.d.ts +1 -0
- package/dist/ui-engine/runtime-header.js +69 -0
- package/dist/ui-engine/scroll-memory-diagnostics.d.ts +16 -0
- package/dist/ui-engine/scroll-memory-diagnostics.js +58 -0
- package/dist/ui-engine/select-engine.d.ts +4 -0
- package/dist/ui-engine/select-engine.js +19 -0
- package/dist/ui-engine/style-resolver.d.ts +77 -0
- package/dist/ui-engine/style-resolver.js +341 -0
- package/dist/ui-engine/text-layout.d.ts +19 -0
- package/dist/ui-engine/text-layout.js +92 -0
- package/dist/ui-engine/transpile-ui.d.ts +11 -0
- package/dist/ui-engine/transpile-ui.js +33 -0
- package/dist/ui-engine/ua-stylesheet.d.ts +3 -0
- package/dist/ui-engine/ua-stylesheet.js +56 -0
- package/dist/ui-engine/ui-file-splitter.d.ts +14 -0
- package/dist/ui-engine/ui-file-splitter.js +47 -0
- package/dist/ui-engine/ui-lowering.d.ts +33 -0
- package/dist/ui-engine/ui-lowering.js +390 -0
- package/dist/ui-engine/ui-registry.d.ts +81 -0
- package/dist/ui-engine/ui-registry.js +429 -0
- package/dist/ui-engine/yoga-layout.d.ts +12 -0
- package/dist/ui-engine/yoga-layout.js +314 -0
- package/package.json +86 -0
- package/src/engine-index.ts +51 -0
- package/src/index.ts +232 -0
- package/src/preview/build-program.ts +734 -0
- package/src/preview/host-gfx.ts +580 -0
- package/src/preview/host-ui-runtime.ts +3245 -0
- package/src/preview/types.ts +96 -0
- package/src/types.ts +127 -0
- package/src/ui-engine/block-layout.ts +104 -0
- package/src/ui-engine/color.ts +263 -0
- package/src/ui-engine/css-parser.ts +1003 -0
- package/src/ui-engine/default-keyboards.ts +58 -0
- package/src/ui-engine/easing.ts +53 -0
- package/src/ui-engine/font-assets.ts +512 -0
- package/src/ui-engine/html-parser.ts +397 -0
- package/src/ui-engine/image-assets.ts +170 -0
- package/src/ui-engine/inline-parser.ts +78 -0
- package/src/ui-engine/keyframes.ts +47 -0
- package/src/ui-engine/layout-engine.ts +228 -0
- package/src/ui-engine/model.ts +1225 -0
- package/src/ui-engine/rich-layout.ts +257 -0
- package/src/ui-engine/run-types.ts +14 -0
- package/src/ui-engine/runtime-header/antialiasing.ts +141 -0
- package/src/ui-engine/runtime-header/blend-bodies.ts +39 -0
- package/src/ui-engine/runtime-header/canvas-helpers.ts +155 -0
- package/src/ui-engine/runtime-header/canvas-scrollbar.ts +105 -0
- package/src/ui-engine/runtime-header/color-mono-refresh.ts +154 -0
- package/src/ui-engine/runtime-header/dirty-scroll-mutators.ts +169 -0
- package/src/ui-engine/runtime-header/display-shim.ts +104 -0
- package/src/ui-engine/runtime-header/forward-decls.ts +137 -0
- package/src/ui-engine/runtime-header/guard-close.ts +8 -0
- package/src/ui-engine/runtime-header/image-drawing.ts +300 -0
- package/src/ui-engine/runtime-header/init-press-input.ts +126 -0
- package/src/ui-engine/runtime-header/keyboard.ts +342 -0
- package/src/ui-engine/runtime-header/node-decoration.ts +212 -0
- package/src/ui-engine/runtime-header/paint-order-coords.ts +190 -0
- package/src/ui-engine/runtime-header/paint-rects-repair.ts +553 -0
- package/src/ui-engine/runtime-header/scroll-physics.ts +161 -0
- package/src/ui-engine/runtime-header/state-bindings-nav.ts +176 -0
- package/src/ui-engine/runtime-header/structs.ts +220 -0
- package/src/ui-engine/runtime-header/text-rendering.ts +715 -0
- package/src/ui-engine/runtime-header/tick/bindings-phase.ts +103 -0
- package/src/ui-engine/runtime-header/tick/dirty-draw-phase.ts +1051 -0
- package/src/ui-engine/runtime-header/tick/flush-phase.ts +17 -0
- package/src/ui-engine/runtime-header/tick/scroll-canvas-phase.ts +15 -0
- package/src/ui-engine/runtime-header/tick/transitions-phase.ts +213 -0
- package/src/ui-engine/runtime-header/tick-motion-helpers.ts +26 -0
- package/src/ui-engine/runtime-header/tick.ts +18 -0
- package/src/ui-engine/runtime-header/touch-keyboard-fwd.ts +406 -0
- package/src/ui-engine/runtime-header/types-defines.ts +79 -0
- package/src/ui-engine/runtime-header.ts +71 -0
- package/src/ui-engine/scroll-memory-diagnostics.ts +79 -0
- package/src/ui-engine/select-engine.ts +21 -0
- package/src/ui-engine/style-resolver.ts +416 -0
- package/src/ui-engine/text-layout.ts +114 -0
- package/src/ui-engine/transpile-ui.ts +45 -0
- package/src/ui-engine/ua-stylesheet.ts +60 -0
- package/src/ui-engine/ui-file-splitter.ts +59 -0
- package/src/ui-engine/ui-lowering.ts +459 -0
- package/src/ui-engine/ui-registry.ts +530 -0
- package/src/ui-engine/yoga-layout.ts +309 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
// Slice of the C++ runtime header (original source lines 1711-1894).
|
|
2
|
+
// rects_intersect, visibility, draw order, owner table, screen bg, coordinate helpers, shadow extents, expand_rect.
|
|
3
|
+
// See docs/superpowers/specs/2026-07-12-split-runtime-header-design.md.
|
|
4
|
+
export function emitPaintOrderCoords(): string {
|
|
5
|
+
return `
|
|
6
|
+
static inline uint8_t ui_rects_intersect(int16_t ax, int16_t ay, int16_t aw, int16_t ah,
|
|
7
|
+
int16_t bx, int16_t by, int16_t bw, int16_t bh) {
|
|
8
|
+
return ax + aw > bx && ax < bx + bw && ay + ah > by && ay < by + bh;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
static inline uint8_t ui_is_effectively_visible(uint16_t nodeIdx) {
|
|
12
|
+
if (nodeIdx >= __ui_node_count) return 0;
|
|
13
|
+
if (!__ui_nodes[nodeIdx].visible) return 0;
|
|
14
|
+
uint16_t p = __ui_nodes[nodeIdx].parent;
|
|
15
|
+
while (p != UI_NO_PARENT && p < __ui_node_count) {
|
|
16
|
+
if (!__ui_nodes[p].visible) return 0;
|
|
17
|
+
p = __ui_nodes[p].parent;
|
|
18
|
+
}
|
|
19
|
+
return 1;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
static inline uint8_t ui_node_draws_before(uint16_t a, uint16_t b) {
|
|
23
|
+
if (__ui_nodes[a].zIndex != __ui_nodes[b].zIndex) {
|
|
24
|
+
return __ui_nodes[a].zIndex < __ui_nodes[b].zIndex;
|
|
25
|
+
}
|
|
26
|
+
return a < b;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Sort node indices once at startup so the dirty draw pass is O(N) instead of
|
|
30
|
+
// re-scanning all nodes for every dirty repaint (O(D·N)).
|
|
31
|
+
static inline void ui_build_draw_order() {
|
|
32
|
+
if (__ui_draw_order || __ui_node_count == 0) return;
|
|
33
|
+
__ui_draw_order = (uint16_t*)malloc((size_t)__ui_node_count * sizeof(uint16_t));
|
|
34
|
+
if (!__ui_draw_order) return;
|
|
35
|
+
for (uint16_t i = 0; i < __ui_node_count; i++) __ui_draw_order[i] = i;
|
|
36
|
+
for (uint16_t a = 1; a < __ui_node_count; a++) {
|
|
37
|
+
uint16_t key = __ui_draw_order[a];
|
|
38
|
+
int16_t j = (int16_t)a - 1;
|
|
39
|
+
while (j >= 0 && ui_node_draws_before(key, __ui_draw_order[j])) {
|
|
40
|
+
__ui_draw_order[j + 1] = __ui_draw_order[j];
|
|
41
|
+
j--;
|
|
42
|
+
}
|
|
43
|
+
__ui_draw_order[j + 1] = key;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Index generic (non-list) scroll containers once so scroll prep doesn't scan
|
|
48
|
+
// every node each frame.
|
|
49
|
+
static inline void ui_build_scroll_owner_table() {
|
|
50
|
+
if (__ui_scroll_owners || __ui_node_count == 0) return;
|
|
51
|
+
uint16_t count = 0;
|
|
52
|
+
for (uint16_t i = 0; i < __ui_node_count; i++) {
|
|
53
|
+
if (__ui_nodes[i].scrollable && !__ui_nodes[i].virtualized) count++;
|
|
54
|
+
}
|
|
55
|
+
__ui_scroll_owner_count = count;
|
|
56
|
+
if (!count) return;
|
|
57
|
+
__ui_scroll_owners = (uint16_t*)malloc((size_t)count * sizeof(uint16_t));
|
|
58
|
+
if (!__ui_scroll_owners) {
|
|
59
|
+
__ui_scroll_owner_count = 0;
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
uint16_t w = 0;
|
|
63
|
+
for (uint16_t i = 0; i < __ui_node_count; i++) {
|
|
64
|
+
if (__ui_nodes[i].scrollable && !__ui_nodes[i].virtualized) {
|
|
65
|
+
__ui_scroll_owners[w++] = i;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
static inline void ui_refresh_active_screen_bg_node() {
|
|
71
|
+
__ui_active_screen_bg_node = 0xFFFF;
|
|
72
|
+
for (uint16_t i = 0; i < __ui_node_count; i++) {
|
|
73
|
+
if (__ui_nodes[i].screenId == __ui_active_screen && __ui_nodes[i].kind == NODE_FILL) {
|
|
74
|
+
__ui_active_screen_bg_node = i;
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
static inline uint8_t ui_scroll_subtree_has_dirty(uint16_t scrollNode) {
|
|
81
|
+
if (scrollNode >= __ui_node_count) return 0;
|
|
82
|
+
uint16_t end = __ui_nodes[scrollNode].subtreeEnd;
|
|
83
|
+
if (end > __ui_node_count) end = __ui_node_count;
|
|
84
|
+
for (uint16_t c = scrollNode + 1; c < end; c++) {
|
|
85
|
+
if (__ui_nodes[c].dirty &&
|
|
86
|
+
ui_is_effectively_visible(c) &&
|
|
87
|
+
__ui_nodes[c].screenId == __ui_active_screen) {
|
|
88
|
+
return 1;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return 0;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
static inline uint8_t ui_is_ancestor_of(uint16_t candidate, uint16_t nodeIdx) {
|
|
95
|
+
uint16_t p = __ui_nodes[nodeIdx].parent;
|
|
96
|
+
while (p != UI_NO_PARENT && p < __ui_node_count) {
|
|
97
|
+
if (p == candidate) return 1;
|
|
98
|
+
p = __ui_nodes[p].parent;
|
|
99
|
+
}
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
static inline int16_t ui_pressed_offset_x_for_node(uint16_t nodeIdx) {
|
|
104
|
+
return __ui_nodes[nodeIdx].value > 0 ? __ui_nodes[nodeIdx].pressedOffsetX : 0;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
static inline int16_t ui_pressed_offset_y_for_node(uint16_t nodeIdx) {
|
|
108
|
+
return __ui_nodes[nodeIdx].value > 0 ? __ui_nodes[nodeIdx].pressedOffsetY : 0;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
static inline int16_t ui_base_draw_x_for_node(uint16_t nodeIdx) {
|
|
112
|
+
return __ui_nodes[nodeIdx].box.x + __ui_nodes[nodeIdx].transformOffsetX;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
static inline int16_t ui_draw_x_for_node(uint16_t nodeIdx) {
|
|
116
|
+
return ui_base_draw_x_for_node(nodeIdx) + ui_pressed_offset_x_for_node(nodeIdx);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
static inline int16_t ui_base_draw_y_for_node(uint16_t nodeIdx) {
|
|
120
|
+
int16_t y = __ui_nodes[nodeIdx].box.y + __ui_nodes[nodeIdx].transformOffsetY;
|
|
121
|
+
uint16_t p = __ui_nodes[nodeIdx].parent;
|
|
122
|
+
while (p != UI_NO_PARENT && p < __ui_node_count) {
|
|
123
|
+
if (__ui_nodes[p].scrollable) y -= __ui_nodes[p].scrollY;
|
|
124
|
+
p = __ui_nodes[p].parent;
|
|
125
|
+
}
|
|
126
|
+
return y;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
static inline int16_t ui_draw_y_for_node(uint16_t nodeIdx) {
|
|
130
|
+
return ui_base_draw_y_for_node(nodeIdx) + ui_pressed_offset_y_for_node(nodeIdx);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Find the scrollable container (list or generic scroll view) whose box contains
|
|
134
|
+
// a point, on the active screen, with content overflowing the viewport. Mirrors
|
|
135
|
+
// the touch path's scroll-scan (ui_touch_down) so the wheel handler finds the
|
|
136
|
+
// SAME owner a drag would — robust against the cursor resting on a non-child
|
|
137
|
+
// node (text, a sibling, padding) where the hit-test + ancestor-walk approach
|
|
138
|
+
// misses. Returns the topmost such node by draw order, or -1 if none.
|
|
139
|
+
static inline int16_t ui_scroll_node_at(int16_t tx, int16_t ty) {
|
|
140
|
+
int16_t bestScroll = -1;
|
|
141
|
+
for (uint16_t i = 0; i < __ui_node_count; i++) {
|
|
142
|
+
if (!__ui_nodes[i].scrollable || !ui_is_effectively_visible(i)) continue;
|
|
143
|
+
if (__ui_nodes[i].screenId != __ui_active_screen) continue;
|
|
144
|
+
if (__ui_nodes[i].contentHeight <= __ui_nodes[i].box.h) continue;
|
|
145
|
+
int16_t drawX = ui_draw_x_for_node((uint16_t)i);
|
|
146
|
+
int16_t drawY = ui_draw_y_for_node((uint16_t)i);
|
|
147
|
+
if (tx >= drawX && tx < drawX + __ui_nodes[i].box.w &&
|
|
148
|
+
ty >= drawY && ty < drawY + __ui_nodes[i].box.h) {
|
|
149
|
+
if (bestScroll < 0 || ui_node_draws_before((uint16_t)bestScroll, i)) bestScroll = (int16_t)i;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return bestScroll;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
static inline UI_COLOR_T ui_parent_clear_color(uint16_t nodeIdx) {
|
|
156
|
+
uint16_t p = __ui_nodes[nodeIdx].parent;
|
|
157
|
+
if (p != UI_NO_PARENT && p < __ui_node_count) {
|
|
158
|
+
return __ui_nodes[p].hasBg ? __ui_nodes[p].bg : __ui_nodes[p].clearColor;
|
|
159
|
+
}
|
|
160
|
+
return __ui_nodes[nodeIdx].clearColor;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
static inline void ui_shadow_extents(uint16_t nodeIdx, int16_t* left, int16_t* top, int16_t* right, int16_t* bottom) {
|
|
164
|
+
*left = 0; *top = 0; *right = 0; *bottom = 0;
|
|
165
|
+
for (uint8_t s = 0; s < __ui_nodes[nodeIdx].shadowCount && s < 4; s++) {
|
|
166
|
+
if (__ui_nodes[nodeIdx].shadowInset[s]) continue;
|
|
167
|
+
int16_t blur = __ui_nodes[nodeIdx].shadowBlur[s];
|
|
168
|
+
if (blur == 0) blur = 1;
|
|
169
|
+
int16_t ox = __ui_nodes[nodeIdx].shadowOffsetX[s];
|
|
170
|
+
int16_t oy = __ui_nodes[nodeIdx].shadowOffsetY[s];
|
|
171
|
+
int16_t l = blur - ox;
|
|
172
|
+
int16_t t = blur - oy;
|
|
173
|
+
int16_t r = blur + ox;
|
|
174
|
+
int16_t b = blur + oy;
|
|
175
|
+
if (l > *left) *left = l;
|
|
176
|
+
if (t > *top) *top = t;
|
|
177
|
+
if (r > *right) *right = r;
|
|
178
|
+
if (b > *bottom) *bottom = b;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
static inline void ui_expand_rect(int16_t* x0, int16_t* y0, int16_t* x1, int16_t* y1,
|
|
183
|
+
int16_t rx0, int16_t ry0, int16_t rx1, int16_t ry1) {
|
|
184
|
+
if (rx0 < *x0) *x0 = rx0;
|
|
185
|
+
if (ry0 < *y0) *y0 = ry0;
|
|
186
|
+
if (rx1 > *x1) *x1 = rx1;
|
|
187
|
+
if (ry1 > *y1) *y1 = ry1;
|
|
188
|
+
}
|
|
189
|
+
`;
|
|
190
|
+
}
|