Skip to content

[Audit][Medium] font.zig measureTextWidth fallback path incorrectly calculates text width #714

@MichaelFisher1997

Description

@MichaelFisher1997

🔍 Module Scanned\n (automated audit scan)\n\n## 📝 Summary\nThe function in has a bug in its fallback bitmap-font path where it subtracts from the final width calculation, causing text width to be underestimated by one pixel per character. This affects text centering and text-fitting via and , resulting in visibly misaligned UI text.\n\n## 📍 Location\n- File: \n- Function/Scope: (fallback path)\n\n## 🔴 Severity: Medium\n- Medium: Incorrect text measurement leading to visual misalignment in UI text rendering\n\n## 💥 Impact\nWhen no font atlas is active (e.g., early startup, font loading failure, or after is called), the fallback bitmap font path incorrectly calculates text width. The formula returns instead of . This causes:\n1. to position text incorrectly (shifted by to the right)\n2. to miscalculate fit scaling\n3. Widget text inputs to position carets and text incorrectly\n\n## 🔎 Evidence\n\n\nCompare with the atlas path which correctly uses accumulation without any final subtraction.\n\nThe bug is called in multiple places:\n- — uses width for centering\n- — uses width for fit calculation \n- — uses text width for centering\n- — uses text width for caret positioning\n- — GPU timing values are right-aligned\n\n## 🛠️ Proposed Fix\nRemove the erroneous from the return statement:\n\n\n\nAlternatively, if the was intentional for some reason, document it and explain why the atlas path doesn't have an equivalent adjustment.\n\n## ✅ Acceptance Criteria\n- [ ] passes with no regressions\n- [ ] Verified that text centering is correct for empty, single-char, and multi-char strings\n- [ ] The fix has been verified with Zig 0.16.0 + SDL3 Dev Environment

Compiler: 0.16.0
assets/shaders/vulkan/ssao_blur.frag
assets/shaders/vulkan/debug_shadow.frag
assets/shaders/vulkan/bloom_downsample.vert
assets/shaders/vulkan/bloom_upsample.vert
assets/shaders/vulkan/debug_shadow.vert
assets/shaders/vulkan/fxaa.vert
assets/shaders/vulkan/post_process.vert
assets/shaders/vulkan/shadow.vert
assets/shaders/vulkan/sky.vert
assets/shaders/vulkan/ssao.vert
assets/shaders/vulkan/taa.vert
assets/shaders/vulkan/terrain.vert
assets/shaders/vulkan/ui.vert
assets/shaders/vulkan/ui_tex.vert
assets/shaders/vulkan/water.vert
assets/shaders/vulkan/bloom_downsample.frag
assets/shaders/vulkan/bloom_upsample.frag
assets/shaders/vulkan/debug_shadow.frag
assets/shaders/vulkan/fxaa.frag
assets/shaders/vulkan/g_pass.frag
assets/shaders/vulkan/post_process.frag
assets/shaders/vulkan/shadow.frag
assets/shaders/vulkan/sky.frag
assets/shaders/vulkan/ssao.frag
assets/shaders/vulkan/ssao_blur.frag
assets/shaders/vulkan/taa.frag
assets/shaders/vulkan/terrain.frag
assets/shaders/vulkan/terrain_debug.frag
assets/shaders/vulkan/ui.frag
assets/shaders/vulkan/ui_tex.frag
assets/shaders/vulkan/water.frag
assets/shaders/vulkan/culling.comp
assets/shaders/vulkan/depth_pyramid.comp
assets/shaders/vulkan/lpv_inject.comp
assets/shaders/vulkan/lpv_propagate.comp
assets/shaders/vulkan/mesh.comp
assets/shaders/vulkan/water.frag
assets/shaders/vulkan/ui.vert
assets/shaders/vulkan/ssao.vert
assets/shaders/vulkan/water.vert
assets/shaders/vulkan/ssao.frag
assets/shaders/vulkan/ui.frag
assets/shaders/vulkan/sky.frag
assets/shaders/vulkan/debug_shadow.vert
assets/shaders/vulkan/terrain.frag
assets/shaders/vulkan/depth_pyramid.comp
assets/shaders/vulkan/taa.frag
assets/shaders/vulkan/g_pass.frag
assets/shaders/vulkan/lpv_propagate.comp
assets/shaders/vulkan/terrain.vert
assets/shaders/vulkan/shadow.frag
assets/shaders/vulkan/shadow.vert
assets/shaders/vulkan/sky.vert
assets/shaders/vulkan/taa.vert
assets/shaders/vulkan/culling.comp
assets/shaders/vulkan/lpv_inject.comp
assets/shaders/vulkan/ui_tex.vert
assets/shaders/vulkan/ui_tex.frag
assets/shaders/vulkan/mesh.comp\n\n## 📚 References\n- Zig standard library for format string handling\n- — atlas path implementation for reference\n- — caller affected by this bug

Metadata

Metadata

Assignees

No one assigned

    Labels

    automated-auditIssues found by automated opencode audit scansbugSomething isn't workingdocumentationImprovements or additions to documentationhotfix

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions