# Canvas Feature QEMU Code Size Report
- Commit: `1fe189eb`
- Date: 2026-05-21T16:05:55.973403
- Build target: `APP=HelloSizeAnalysis APP_SUB=canvas_path_probe PORT=qemu CPU_ARCH=cortex-m0plus`
- Measurement method: compile a dedicated probe app, then rewrite app-local feature override + probe config headers to enable one feature set.
- Scope: feature-level static qemu ELF sections only (`.text/.rodata/.data/.bss`).
## 说明
- 这份报告解决的是“整项能力值不值得开”的问题,不是单个函数的边际成本。
- baseline 明确关闭 `MASK/QOI/RLE` 这类有总开关的 feature,再与 feature-on 变体比较。
- 对于没有全局开关的能力,例如 `IMAGE_TRANSFORM`、`TEXT_TRANSFORM`、`GRADIENT`,这里仍使用 probe 聚合场景代表该 feature 的总体成本。
- HQ line/circle/arc 不在这份报告里,仍请看 `hq_size_report.md`。
## Baseline
| Variant | Text | Rodata | Data | Bss | Total ROM |
|---------|-----:|-------:|-----:|----:|----------:|
| BASELINE | 14532 | 596 | 1368 | 6368 | 15128 |
## Feature Summary
| Feature | Delta Text | Delta Rodata | Delta Data | Delta Bss | Delta ROM |
|---------|-----------:|-------------:|-----------:|----------:|----------:|
| BASIC_GEOMETRY | +13436 | +724 | +0 | +4 | +14160 |
| CIRCLE_ARC_BASIC | +13716 | +1844 | +0 | +4 | +15560 |
| LINE_FAMILY | +4540 | +12 | +0 | +4 | +4552 |
| GRADIENT_FEATURE | +13076 | +804 | +0 | +4 | +13880 |
| MASK_FEATURE | +25228 | +928 | +0 | +12 | +26156 |
| IMAGE_STD_FEATURE | +10772 | +108 | +0 | +12 | +10880 |
| IMAGE_TRANSFORM | +16164 | +476 | +0 | +12 | +16640 |
| TEXT_TRANSFORM | +21008 | +6432 | +0 | +12 | +27440 |
| RLE_CODEC | +6900 | +152 | +0 | +48 | +7052 |
| QOI_CODEC | +8600 | +148 | +0 | +1244 | +8748 |
| ALL_COMMON_CANVAS_FEATURES | +115692 | +8420 | +0 | +1280 | +124112 |
## Feature Definition
| Feature | Included Scenes | Description |
|---------|-----------------|-------------|
| BASIC_GEOMETRY | `RECT_*`
`ROUND_RECT_*`
`TRIANGLE_*` | Basic geometry paths for rect, round-rect and triangle, excluding circle and arc. |
| CIRCLE_ARC_BASIC | `CIRCLE_BASIC_*`
`ARC_BASIC_*` | Basic circle and arc feature set, including LUT-related dependency cost. |
| LINE_FAMILY | `LINE`
`POLYLINE` | Basic line and polyline feature set. |
| GRADIENT_FEATURE | `GRADIENT_RECT`
`GRADIENT_ROUND_RECT`
`GRADIENT_CIRCLE` | Shape gradient feature set. |
| MASK_FEATURE | `MASK_CIRCLE`
`MASK_ROUND_RECT`
`MASK_IMAGE` | Mask feature set measured with circle, round-rect and image mask representative scenes. |
| IMAGE_STD_FEATURE | `IMAGE_DRAW`
`IMAGE_RESIZE`
`IMAGE_TINT` | Standard image draw, resize and tint feature set. |
| IMAGE_TRANSFORM | `IMAGE_ROTATE` | Image transform and rotation feature. |
| TEXT_TRANSFORM | `TEXT_ROTATE` | Text transform and rotation feature. |
| RLE_CODEC | `RLE_DRAW` | RLE codec enabled, plus one representative draw path to reflect full linked cost. |
| QOI_CODEC | `QOI_DRAW` | QOI codec enabled, plus one representative draw path to reflect full linked cost. |
| ALL_COMMON_CANVAS_FEATURES | `all common non-HQ canvas features` | All common non-HQ canvas features enabled together. |
## Detailed Variants
| Variant | Feature Config | Text | Rodata | Data | Bss | Total ROM |
|---------|-------------------|-----:|-------:|-----:|----:|----------:|
| BASELINE | `-DEGUI_CONFIG_FUNCTION_SUPPORT_MASK=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_QOI=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_RLE=0` | 14532 | 596 | 1368 | 6368 | 15128 |
| BASIC_GEOMETRY | `-DEGUI_CONFIG_FUNCTION_SUPPORT_MASK=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_QOI=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_RLE=0 -DEGUI_SIZE_PROBE_RECT_STROKE_PATH=1 -DEGUI_SIZE_PROBE_RECT_FILL_PATH=1 -DEGUI_SIZE_PROBE_ROUND_RECT_STROKE_PATH=1 -DEGUI_SIZE_PROBE_ROUND_RECT_FILL_PATH=1 -DEGUI_SIZE_PROBE_TRIANGLE_STROKE_PATH=1 -DEGUI_SIZE_PROBE_TRIANGLE_FILL_PATH=1` | 27968 | 1320 | 1368 | 6372 | 29288 |
| CIRCLE_ARC_BASIC | `-DEGUI_CONFIG_FUNCTION_SUPPORT_MASK=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_QOI=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_RLE=0 -DEGUI_SIZE_PROBE_CIRCLE_BASIC_STROKE_PATH=1 -DEGUI_SIZE_PROBE_CIRCLE_BASIC_FILL_PATH=1 -DEGUI_SIZE_PROBE_ARC_BASIC_STROKE_PATH=1 -DEGUI_SIZE_PROBE_ARC_BASIC_FILL_PATH=1` | 28248 | 2440 | 1368 | 6372 | 30688 |
| LINE_FAMILY | `-DEGUI_CONFIG_FUNCTION_SUPPORT_MASK=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_QOI=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_RLE=0 -DEGUI_SIZE_PROBE_LINE_PATH=1 -DEGUI_SIZE_PROBE_POLYLINE_PATH=1` | 19072 | 608 | 1368 | 6372 | 19680 |
| GRADIENT_FEATURE | `-DEGUI_CONFIG_FUNCTION_SUPPORT_MASK=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_QOI=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_RLE=0 -DEGUI_SIZE_PROBE_GRADIENT_RECT_PATH=1 -DEGUI_SIZE_PROBE_GRADIENT_ROUND_RECT_PATH=1 -DEGUI_SIZE_PROBE_GRADIENT_CIRCLE_PATH=1` | 27608 | 1400 | 1368 | 6372 | 29008 |
| MASK_FEATURE | `-DEGUI_CONFIG_FUNCTION_SUPPORT_MASK=1 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_QOI=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_RLE=0 -DEGUI_SIZE_PROBE_MASK_CIRCLE_PATH=1 -DEGUI_SIZE_PROBE_MASK_ROUND_RECT_PATH=1 -DEGUI_SIZE_PROBE_MASK_IMAGE_PATH=1` | 39760 | 1524 | 1368 | 6380 | 41284 |
| IMAGE_STD_FEATURE | `-DEGUI_CONFIG_FUNCTION_SUPPORT_MASK=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_QOI=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_RLE=0 -DEGUI_SIZE_PROBE_IMAGE_DRAW_PATH=1 -DEGUI_SIZE_PROBE_IMAGE_RESIZE_PATH=1 -DEGUI_SIZE_PROBE_IMAGE_TINT_PATH=1` | 25304 | 704 | 1368 | 6380 | 26008 |
| IMAGE_TRANSFORM | `-DEGUI_CONFIG_FUNCTION_SUPPORT_MASK=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_QOI=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_RLE=0 -DEGUI_SIZE_PROBE_IMAGE_ROTATE_PATH=1` | 30696 | 1072 | 1368 | 6380 | 31768 |
| TEXT_TRANSFORM | `-DEGUI_CONFIG_FUNCTION_SUPPORT_MASK=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_QOI=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_RLE=0 -DEGUI_SIZE_PROBE_TEXT_ROTATE_PATH=1` | 35540 | 7028 | 1368 | 6380 | 42568 |
| RLE_CODEC | `-DEGUI_CONFIG_FUNCTION_SUPPORT_MASK=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_QOI=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_RLE=1 -DEGUI_SIZE_PROBE_RLE_DRAW_PATH=1` | 21432 | 748 | 1368 | 6416 | 22180 |
| QOI_CODEC | `-DEGUI_CONFIG_FUNCTION_SUPPORT_MASK=0 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_QOI=1 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_RLE=0 -DEGUI_SIZE_PROBE_QOI_DRAW_PATH=1` | 23132 | 744 | 1368 | 7612 | 23876 |
| ALL_COMMON_CANVAS_FEATURES | `-DEGUI_CONFIG_FUNCTION_SUPPORT_MASK=1 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_QOI=1 -DEGUI_CONFIG_FUNCTION_IMAGE_CODEC_RLE=1 -DEGUI_SIZE_PROBE_RECT_STROKE_PATH=1 -DEGUI_SIZE_PROBE_RECT_FILL_PATH=1 -DEGUI_SIZE_PROBE_ROUND_RECT_STROKE_PATH=1 -DEGUI_SIZE_PROBE_ROUND_RECT_FILL_PATH=1 -DEGUI_SIZE_PROBE_TRIANGLE_STROKE_PATH=1 -DEGUI_SIZE_PROBE_TRIANGLE_FILL_PATH=1 -DEGUI_SIZE_PROBE_CIRCLE_BASIC_STROKE_PATH=1 -DEGUI_SIZE_PROBE_CIRCLE_BASIC_FILL_PATH=1 -DEGUI_SIZE_PROBE_ARC_BASIC_STROKE_PATH=1 -DEGUI_SIZE_PROBE_ARC_BASIC_FILL_PATH=1 -DEGUI_SIZE_PROBE_LINE_PATH=1 -DEGUI_SIZE_PROBE_POLYLINE_PATH=1 -DEGUI_SIZE_PROBE_GRADIENT_RECT_PATH=1 -DEGUI_SIZE_PROBE_GRADIENT_ROUND_RECT_PATH=1 -DEGUI_SIZE_PROBE_GRADIENT_CIRCLE_PATH=1 -DEGUI_SIZE_PROBE_MASK_CIRCLE_PATH=1 -DEGUI_SIZE_PROBE_MASK_ROUND_RECT_PATH=1 -DEGUI_SIZE_PROBE_MASK_IMAGE_PATH=1 -DEGUI_SIZE_PROBE_IMAGE_DRAW_PATH=1 -DEGUI_SIZE_PROBE_IMAGE_RESIZE_PATH=1 -DEGUI_SIZE_PROBE_IMAGE_TINT_PATH=1 -DEGUI_SIZE_PROBE_IMAGE_ROTATE_PATH=1 -DEGUI_SIZE_PROBE_TEXT_ROTATE_PATH=1 -DEGUI_SIZE_PROBE_RLE_DRAW_PATH=1 -DEGUI_SIZE_PROBE_QOI_DRAW_PATH=1` | 130224 | 9016 | 1368 | 7648 | 139240 |
## Reproduce
```bash
python scripts/size_analysis/main.py canvas-feature-size-to-doc
```
Raw JSON is written to `output/canvas_feature_size_results.json`.