fix(sdk+launcher): 图标不渲染真根因(agent-219) — meow_ui_img.c scale_buf cover 采样把乘写成除(÷缩放比→采到源图左上角透明区,全丢); 改乘+居中裁剪偏移修正; 宿主旧测试用纯色图掩盖了该bug。+ main_menu App退出/结构变化重绘时 fb_pan_buf0_force 无条件pan回buffer0(防App翻页留buffer1致菜单残帧)

meow_ui.a→3e0ee8f7 launcher→9d0efc2f hello→9609ea6e files→90f5cf07 ncm→be8be221(均已上卡); 真机截图证据 .tmp/meowbug/fix1.png+fix_b2_after.png
This commit is contained in:
MeowOS committed 2026-08-31 15:42:24 +08:00
1 parent 05a19a9ea3
commit ab4da09e75
45 files changed
+1926 -147

No files matched your search

@@ -0,0 +1,64 @@
/* bench/offline_track_all.c — 二期大歌单分页 离线样本重放(不打网络)。
*
* 用与 App 完全相同的 core 解析函数 ncm_api_parse_track_all 解析一段合成的
* /api/playlist/track/all 响应(songs[] 全量对象含 al.picUrl + total)。纯解析,
* 验证:① 数组路径 songs 命中;② id >2^31 不溢出;③ 新字段 al.picUrl 解析。
* 风控纪律:验证期 0 次真实 NCM 请求(离线样本重放)。
* 编译(宿主):$CC_HOST -O2 -DJSMN_HEADER -Icore -I../vendor/jsmn \
* offline_track_all.c ../out/core-host/*.o \
* -L../out/mbedtls/host -lmbedtls -lmbedx509 -lmbedcrypto -lz -lpthread -lm -o offline_track_all
*/
#include "ncm.h"
#include <stdio.h>
#include <string.h>
static int g_fail = 0;
#define CHECK(cond, fmt, ...) do { \
if (cond) printf(" PASS " fmt "\n", ##__VA_ARGS__); \
else { printf(" FAIL " fmt "\n", ##__VA_ARGS__); g_fail = 1; } \
} while (0)
int main(void) {
/* 合成真实形态 track/all 响应:songs[](全 song 对象,含 al.picUrl)+ total。
* id 用 >2^31 数字(2746301825),验 int64 不溢出;al.picUrl 验专辑封面。 */
const char *json =
"{\"code\":200,\"songs\":["
"{\"id\":2746301825,\"name\":\"Chrono Rewind\",\"dt\":253000,\"fee\":1,"
" \"ar\":[{\"name\":\"CVRCH\"}],"
" \"al\":{\"name\":\"Rewrite\",\"picUrl\":\"http://p1.music.126.net/ab/cover1.jpg\"}},"
"{\"id\":2048962657,\"name\":\"Verve\",\"dt\":210000,\"fee\":0,"
" \"ar\":[{\"name\":\"Ryan Taubert\"}],"
" \"al\":{\"name\":\"Rebuild\",\"picUrl\":\"https://p2.music.126.net/cd/cover2.jpg\"}}"
"],\"total\":5191}";
ncm_song_t songs[8];
int n = 0;
int64_t total = 0;
int rc = ncm_api_parse_track_all(json, strlen(json), songs, 8, &n, &total);
CHECK(rc == NCM_OK, "parse_track_all rc=%d", rc);
CHECK(n == 2, "parsed 2 songs (n=%d)", n);
CHECK(total == 5191, "total=%lld", (long long)total);
CHECK(strcmp(songs[0].name, "Chrono Rewind") == 0, "song0 name='%s'", songs[0].name);
CHECK(strcmp(songs[0].art_name, "CVRCH") == 0, "song0 artist='%s'", songs[0].art_name);
CHECK(strcmp(songs[0].album_name, "Rewrite") == 0, "song0 album='%s'", songs[0].album_name);
CHECK(strcmp(songs[0].al_pic, "http://p1.music.126.net/ab/cover1.jpg") == 0,
"song0 al_pic='%s'", songs[0].al_pic);
CHECK(strcmp(songs[1].id, "2048962657") == 0, "song1 id='%s'(numeric->text)", songs[1].id);
CHECK(strcmp(songs[1].al_pic, "https://p2.music.126.net/cd/cover2.jpg") == 0,
"song1 al_pic='%s'", songs[1].al_pic);
CHECK(songs[0].duration_ms == 253000 && songs[0].fee == 1, "song0 dt=%ld fee=%d",
songs[0].duration_ms, songs[0].fee);
/* 数组路径容错:缺 songs 但嵌套 playlist.tracks 也应命中(防御真实端点变体)。 */
const char *json2 =
"{\"code\":200,\"playlist\":{\"trackCount\":3,\"tracks\":["
"{\"id\":1,\"name\":\"A\",\"dt\":1000,\"fee\":0,\"ar\":[{\"name\":\"X\"}],"
"\"al\":{\"name\":\"AL\",\"picUrl\":\"http://x/y.jpg\"}}]}}";
int n2 = 0; int64_t t2 = 0;
rc = ncm_api_parse_track_all(json2, strlen(json2), songs, 8, &n2, &t2);
CHECK(rc == NCM_OK && n2 == 1, "parse variant playlist.tracks rc=%d n=%d", rc, n2);
CHECK(t2 == 3, "variant total(trackCount)=%lld", (long long)t2);
printf("%s\n", g_fail ? "RESULT: FAIL" : "RESULT: PASS");
return g_fail ? 1 : 0;
}