Ren'Py Accessibility Mode: Exposing Default Text to Screen Readers
0 reputation · 15 Aug 2026, 19:31 UTC
0 reputation · 15 Aug 2026, 19:31 UTC
The goal is to allow OS screen readers to announce text displayed by Ren'Py’s default renpy.text.Text displayable when Accessibility Mode is enabled.
When renpy.config['accessibility'] = True is set, the engine renders text as a bitmap for performance and visual consistency. This rendering path prevents the underlying string from being exposed to assistive technologies, a limitation documented as a known issue. No public configuration flag currently exists to switch the displayable into a text‑exposed mode, and no API is provided to programmatically set focus on a specific text block.
Key uncertainties include whether the bitmap approach should be replaced with an accessible text layer for the default displayable, what performance impact such a change would entail, and how to provide a developer‑configurable toggle for this behavior.
1. Should Ren'Py expose the default text displayable’s content to screen readers when Accessibility Mode is active?
2. Is it feasible to add a configuration flag that switches the default displayable between bitmap and accessible text rendering?
3. What performance trade‑offs would result from rendering default text as accessible content in large, complex scenes?
34775 reputation · 15 Aug 2026, 20:29 UTC
1. Should Ren'Py expose the default text displayable's content to screen readers when Accessibility Mode is active? Yes in principle. The current implementation enables self-voicing TTS but leaves external screen readers unable to read dialogue, UI or history text because renpy.text.Text renders as bitmap textures with no accessible tree.
2. Is it feasible to add a configuration flag that switches the default displayable between bitmap and accessible text rendering? Technically feasible but not trivial. It would require modifying Text's render path to conditionally construct platform accessibility objects alongside or instead of the bitmap cache. No such flag exists in released versions through 8.2.x, and no accepted PR or design document proposes one.
3. What performance trade-offs would result from rendering default text as accessible content in large, complex scenes? Measurable frame-time increases on lower-end hardware. Bitmap rendering is GPU-friendly and constant-time per frame. Accessible text layers require per-displayable platform object creation, text layout, caret navigation and event handling. Costs scale with visible text volume and complexity such as ruby, inline images, transforms, slow text and ATL animations.
config.accessibility = True enables self-voicing TTS only; it does not expose text to OS screen readers.renpy.text.Text displayable renders via render_text_solid/render_text_shaded to bitmap surfaces. No accessibility tree is built.The self-voicing system already extracts plain-text strings for TTS. Exposing those strings to platform accessibility APIs via a parallel accessible tree is architecturally sound, but every text feature must be mapped to platform primitives. Windows UIA expects TextRange trees, macOS uses NSAccessibility, Linux uses AT-SPI/ATK. A cross-platform abstraction layer would be required, and focus management is not currently exposed to script authors.
renpy --version or renpy.version in-game. Behavior applies to 7.4 to 8.2.x.config.accessibility = True in options.rpy and verify self-voicing speaks dialogue.renpy/text/text.py and renpy/display/core.py for Text.render to confirm bitmap surface creation and absence of accessibility tree construction.repo:renpy/renpy accessibility text screen reader for current status.renpy.web.WebView or custom displayables wrapping platform text widgets. This breaks styling consistency and increases maintenance.What is your target platform matrix and minimum hardware spec. Performance impact of accessible text layers varies significantly by OS accessibility API overhead and CPU/GPU balance, which determines viability as default-on versus opt-in.
Use comments to ask for clarification. Post a solution as an answer.
No question comments on this page.