sdk: 增量同步主仓新模块(box/anim/scroll/dispatch/listvirt/str/sb_icons/img)

subtree pull sdk 来自主仓 pub/sdk(主仓 commit 68ce46a 等)。新增:
- 布局引擎 meow_ui_box / 动画基座 meow_ui_anim / 滚动物理 meow_ui_scroll
- §6.4 事件分发形式化 / W_LISTVIEW 虚拟化多行 / meow_str 字符串资源 i18n
- sb_icons 动作图标扩充 + topbar 位图图标 / meow_img_downscale
- tools/ 图标生成脚本与 SVG 源
- 对应宿主 test_*.c 与 demo_box_scroll.c

build_sdk.sh 冲突解析:保留公开仓自包含版(vendored meow_font + -Iinclude -I.),
OBJS 手工并入 4 个新模块(meow_ui_box/anim/scroll/str)。保留 vendored meow_font.c/
meow_ipc.h/meow_font.h/meow_notif.h,剔除宿主测试二进制与编译产物。
This commit is contained in:
AskaEth committed 2026-09-02 09:08:51 +08:00
commit 4b094d62a5
56 files changed
+4327 -117

No files matched your search

+75
View File
@@ -0,0 +1,75 @@
/*
* meow_ui_anim.h — SDK 动画基座 + UI 节拍器(§12.2:meow_anim / meow_anim_tick)。
*
* 定位:给应用提供**时间驱动 tween**(from/to/duration/easing)+ 完成/取消回调,并行多动画
* (静态池≤MEOW_ANIM_MAX)+ 与脏区集成(动画帧只标动画影响区,不做整屏重绘)。
*
* 节拍:**挂既有 on_tick 机制**(meow_ui_run 主循环 / meow_ui_feed_tick 阻塞 IME 循环),
* 无常驻高频轮询;无动画时 meow_anim_tick() 只做一个计数检查即返回(零开销)。
*
* 内存纪律:静态池(≤MEOW_ANIM_MAX),start/cancel/tick 全程零 malloc。
*
* 与 §7 的关系:§7(B1 最小可用)是「应用自己在 on_tick 里用 meow_ui_time_ms 做时间轴」;
* 本模块把这件事收敛成声明式 tween 对象 + 结束回调,是 §7 的**正式基座**(应用可任选其一或混用)。
*/
#ifndef MEOW_UI_ANIM_H
#define MEOW_UI_ANIM_H
#include "meow_ui_types.h" /* 基础类型(子头不引伞头,避免相对路径依赖) */
#ifdef __cplusplus
extern "C" {
#endif
/* ---- 缓动曲线(t∈[0,1] → 曲线化的进度;OVERSHOOT 在中后段可略>1、末点恰=1)---- */
typedef enum {
MEOW_EASE_LINEAR = 0,
MEOW_EASE_OUT = 1, /* 快进慢停(decelerate) */
MEOW_EASE_IN_OUT = 2, /* 慢入慢出 */
MEOW_EASE_OVERSHOOT = 3, /* 越过目标再回稳(小回弹) */
} meow_ease;
float meow_ease_apply(meow_ease e, float t);
/* ---- 动画对象(不透明句柄;静态池)---- */
#define MEOW_ANIM_MAX 16
typedef struct meow_anim meow_anim;
/* 每帧回调:v = 当前插值值(from + (to-from)*ease(t))。app 在此更新状态并绘制。 */
typedef void (*meow_anim_update_fn)(meow_anim *a, float v, void *ctx);
/* 完成/取消回调:canceled=1=被取消,0=自然完成。 */
typedef void (*meow_anim_done_fn)(meow_anim *a, int canceled, void *ctx);
typedef struct meow_anim_desc {
float from;
float to;
uint32_t duration_ms; /* 时长(ms);0 视为瞬发(下一 tick 完成) */
meow_ease ease;
meow_anim_update_fn update; /* 可 NULL */
meow_anim_done_fn done; /* 可 NULL */
void *ctx;
} meow_anim_desc;
/* 启动一个动画(空闲槽;池满返回 NULL)。start 即置 value=from 并回调一次 update(0)。 */
meow_anim *meow_anim_start(const meow_anim_desc *d);
/* 取消(触发 done(canceled=1),不再 update)。 */
void meow_anim_cancel(meow_anim *a);
/* 查询:仍在运行(value 未达终点)。 */
int meow_anim_active(meow_anim *a);
/* 查询:当前插值值。 */
float meow_anim_value(meow_anim *a);
/* 与脏区集成:动画每 tick 只 flush 影响区(x,y,w,h;x<0 表示不自动 flush)。
* app 的 update 回调通常也会用 meow_ui_flush_region 自刷;设了这个则 tick 自动刷一次,
* 保证「动画帧只标脏动画影响区,不整屏」。 */
void meow_anim_set_region(meow_anim *a, int x, int y, int w, int h);
/* ---- 节拍器(挂在 on_tick / meow_ui_feed_tick;无动画零开销)---- */
void meow_anim_tick(void); /* 推进所有活动动画(完成/取消在内部处理) */
unsigned meow_anim_count(void); /* 活动动画数(0=空闲) */
#ifdef __cplusplus
}
#endif
#endif /* MEOW_UI_ANIM_H */