Modern text shaping and font rendering for Minecraft 1.12.2 on Cleanroom.
简体中文 · GitHub
Neo Font Render replaces Minecraft 1.12.2's bitmap-font path with configurable modern renderers.
- Cosmic Text — default renderer with native text shaping, ligatures, kerning, BiDi, and emoji ZWJ sequences.
- SFR/AWT — built-in Java2D AWT compatibility renderer for troubleshooting.
- System fonts, local TTF/OTF/TTC files, bundled Noto Sans SC, Noto Color Emoji, and fallback chains.
- Variable font weight axis support, per-style Cosmic face overrides (regular/bold/italic).
- Adaptive raster scale (1.5x–14x), mipmapping, anisotropic filtering, and GL interpolation.
- Modern single-pass shadow with configurable blur radius, offset, opacity, and color.
- Colored shadows: each text segment's shadow uses its own foreground hue, with configurable RGB remap rules.
- Classic shadow with mode control (all/mask/emoji/none) and shadow masking rules.
- Advanced string mode for full-span shaped-text rendering across the entire formatted string.
- Enhanced and shader text pipelines for improved anti-aliased edge quality.
- Brightness compensation with auto-detection from sample glyph rasterization.
- Segment cache for efficient partial-text rendering without advanced string mode.
- §n underline and §m strikethrough text decorations (native in Cosmic, composited in AWT).
- Hex chat gradients:
#RRGGBB-RRGGBBmulti-stop color interpolation in chat text. - Synthetic bold in the Cosmic engine when a real bold face is unavailable.
- Customizable legacy text color palette (16/32 entries, vanilla/runtime/custom/API-registered providers).
- Unicode/IME input fixes, CJK line-break rules, text undo/redo.
- Sign-editor paste (Ctrl+V) with multi-line wrapping and configurable sign optimizations (LOD, frustum culling, occlusion culling).
- TinkersAntique PUA marker compatibility and enchantment table font replacement.
- Forge loading screen and ModernSplash font override.
- In-game modular tabbed settings screen (12 tabs) with extension API for other mods.
- F3 debug overlay with engine, cache, and sign occlusion stats.
- Emoji test diagnostic screen,
/neofontrendercommand suite.
The project ships as a main mod and several optional modules. All UIE modules share a single settings screen.
License note: The main mod is MIT. UI Enhancements source code is MIT, but the distributed JAR links against LGPL-3.0 libraries (Arc3D Core, ModularUI) and embeds LGPL-2.1 (Jazzy) and Apache-2.0 (TabbyChat, Salutation, jieba-analysis) components, so the combined work is effectively LGPL-3.0. See NOTICE.md and the bundled
META-INF/LICENSE-*files for full details.
| Mod | Mod ID | License | Description |
|---|---|---|---|
| TabbyChat 2 Reforged | tabbychat2 |
Apache-2.0 | Chat channel tabs, filters, anti-spam, per-channel history and logging. Standalone JAR not required. |
| Salutation 1.12.2 | salutation |
Apache-2.0 | Command tree, argument parsers, multiline chat backend, sleep-chat screen, and advanced tab completion. Standalone JAR not required. |
| Module | Description |
|---|---|
| Modern Tooltips | Full tooltip replacement with rounded corners, soft shadows, adaptive border colors (rarity/enchantment-based), Mica translucent backdrop, center-titled layout, mod name display. Supports HEI, Obscure Tooltips, and Quark map compat. |
| Smooth Scrolling | Animated wheel scrolling for vanilla GuiSlot lists, Forge scrolling lists, creative inventory grid, and chat history. Configurable duration and step size. |
| Screen Effects | Background Gaussian blur (post-processing shader), four-corner color gradient overlay, and fade-in/fade-out transitions. Per-screen-type control for menus, containers, and chat. |
| HUD Bars | Modern replacement for vanilla health, food, armor, toughness, air, and mount bars. 6 visual themes (modern, flat, glass, segmented, minimal, classic), smooth animated fill, per-stat color customization, numeric/icon display. AppleCore integration. |
| Enhanced Chat | See sub-features below. Includes inline image glyphs, H2-backed persistence, and group chat. |
| Zoom | Hold-to-zoom keybind with configurable magnification (2–8x), smooth camera, mouse sensitivity adjustment, and animated FOV transitions. |
| Hover Effects | Smooth cross-fade animations for vanilla/Forge buttons, inventory slots, JEI/HEI ingredient grids, and ModularUI slots. |
| World Loading | Modern loading overlay for world join and dimension change. Progress bar, percentage, spinner, bottom gradient shade, fade-out transition, last-exit frame snapshot. |
| Resource Reload | Progress overlay during resource pack and language reload with progress bar, percentage, and spinner. |
| Main Menu | "Continue Game" button to directly rejoin the last played world or server. |
| Create World | Three layout themes for the create-world screen: vanilla, tabbed, and modernui. |
| Text Input | OS-style I-beam cursor over vanilla and ModularUI text fields. |
| Flight Control | Continuous three-axis Elytra flight with momentum mode, per-axis sensitivity/inversion, controller input API for third-party gamepad mods, third-person pose sync, and barrel rolls. Includes an Arc3D-powered flight HUD with layouts inspired by Airbus, Boeing, and MSFS avionics, plus FPV OSD and cinematic tactical themes. User themes live in neofontrender/flight_hud_themes. |
| Crosshair | Custom crosshair with 10 styles (vanilla, cross, dot, circle, square, triangle, arrow, flight-chevron, debug, pixel-drawn), independent sizing/rotation/offsets, adaptive contrast, outlines, center dots, contextual visibility, dynamic attack/bow spread, target colors, rainbow animation, cooldown rings, low-durability warnings, ammunition indicators, and in-game pixel editor. Shoulder Surfing compatibility included. |
| Feature | Description |
|---|---|
| Tabbed chat | Embedded TabbyChat 2 with channel tabs, per-channel history and logging, anti-spam, timestamps, spelling check, unread flashing. |
| Vertical tabs | Edge-style vertical tab layout on the left edge of the chat window. |
| Tab pinning | Pin/unpin/delete channel tabs via right-click context menu. |
| Chat search | Full-text search across chat history with Ctrl+F. Keyboard navigation (↑↓/Enter/Esc), matched-term highlighting, jump-to-message in TabbyChat. |
| Chat history | Ctrl+H opens a dedicated history browser with scope filtering (All/Player/Server/Private/Group) and per-scope management. |
| Group chat | Server-side group channels with /nfrgroup command, automatic source routing, and TabbyChat group tabs. |
| Inline image glyphs | Render Gosling/Emojicord emoji :aliases:, external <img:https://…> images (with allow/blocklist), and local image gallery (neofontrender/images/). Hover preview and right-click copy. |
| Source classification | Regex-based message routing into Player/Server/Private/Group channels. |
| Message filtering | Regex-based message blocking and per-player muting. |
| @mention completion | Live @player suggestions from online player list with notification sound. |
| Command completion | Scrollable tab-completion suggestions while typing. |
| Player links | Clickable player names with double-click interaction, avatar tooltips, and context menu (private message, whisper, copy name, mute). |
| Player heads | Renders cached player head avatars next to chat messages. |
| Item icons | Displays item icons beside SHOW_ITEM chat components. |
| Timestamps | Configurable timestamps prepended to chat messages. |
| Copy & paste | Drag-to-select text copying with formatting code options, Ctrl+C/X/V/A keybindings. |
| Right-click menu | Context menu on chat messages for copy, player actions, and inline image operations. |
| Keep-open policies | Per-source-type control for keeping chat open after sending. |
| HUD window | Floating chat window with compositor support for persistent/detached layout. |
| Persistence | Per-server/world persistent received and sent message history backed by an embedded H2 database with automatic legacy JSON migration. |
| Message animations | Entrance animations for new messages and chat input open/close. |
| Color theme | Full color theme for the chat panel (background, border, input, tray, tabs, scrollbar, text — 11 color slots). |
| Spellcheck | Jazzy (English) + Jieba (Chinese) spell checking. |
| Minecraft | Branch | Primary maintainer | Runtime |
|---|---|---|---|
| 1.12.2 | main |
AndreaFrederica | Cleanroom + Java 25 |
| 1.7.10 | 1.7.10 |
DHJComical | Forge + lwjgl3ify |
The 1.7.10 port shares the core rendering engine and API surface but targets Forge with lwjgl3ify
instead of Cleanroom. See the 1.7.10 branch
for version-specific documentation and releases.
- Minecraft 1.12.2 with Cleanroom.
- Java 25.
- Revo UI requires our ModularUI 3.2.0-nfr.1 fork, which provides the device-neutral navigation API used by UI navigation and controller support. Upstream ModularUI 3.1.6 does not provide this API and is not compatible with this Revo UI build.
Download the distribution that fits your installation and put it in the mods folder. The full package is the usual choice.
| File | Use it when |
|---|---|
neofontrender-<version>-full.jar |
You want the complete, all-in-one installation. |
neofontrender-<version>-core.jar |
You want the small core renderer and system fonts. |
neofontrender-resources-<version>.jar |
You use core and also want bundled font resources. |
Do not install full together with the split core or resources packages.
Install neofontrender-ui-enhancements-<version>.jar and the bundled custom
modularui-<version>.jar alongside the main mod. The controller support, server companion, and
Electric Elytra JARs on the same release are optional.
Open the configuration screen with O; P opens the emoji test screen. The main configuration file is:
.minecraft/config/neofontrender.toml
Place custom font files in:
.minecraft/neofontrender/fonts/
New installations use these rendering defaults:
[font]
size = 8.5
[rendering]
engine = "cosmic"
interpolation = true
advancedStringMode = trueCosmic can fall back to configured system fonts and bundled resources when a glyph is missing. If it is unavailable, select sfr in the settings screen to use the compatibility renderer.
Useful commands:
/neofontrender info
/neofontrender fonts
/neofontrender reload
/neofontrender gui
Work in progress — the group chat feature is functional but the interface and configuration workflow may change in future releases.
Group chat lets you message multiple players at once through named groups defined on the server. Requires Revo UI (client) and UIE Server Companion (dedicated server) or just UIE (integrated server).
1. Define groups — create or edit config/nfr-group-chat.properties on the server:
# Format: groups.<name>=player1,player2,...
groups.friends=Steve,Alex
groups.admins=StevePlayer names are case-insensitive. Lines starting with # are comments.
2. Use the commands:
| Command | Alias | Description |
|---|---|---|
/nfrgroup |
/g |
List all configured groups |
/nfrgroup <name> |
/g <name> |
Show members of a group |
/nfrgroup <name> <message> |
/g <name> <message> |
Send a message to all online members |
/nfrmessage <p1> [p2 ...] <msg> |
/nfrtell |
Private-message several players at once (up to 32) |
3. Client experience:
- Group messages are automatically classified as
Groupsource and routed to a dedicated TabbyChat channel tab. - Received format:
§6Steve -> group friends Hello; sent:§7Steve -> group friends Hello. - Messages are persisted in the H2 database and browsable via
Ctrl+Hwith the "Group" filter.
All APIs live under neofontrender.api and are safe to use with an optional dependency. Check
Loader.isModLoaded("neofontrender") before referencing any class. Reusable GUI controls intended
for dependent mods are available under neofontrender.client.gui.component.base.
Update the active font without touching NFR's internal config or renderer classes. apply() is safe
from any thread: it schedules the update on the client thread, optionally persists it, and reloads
the backend once.
import neofontrender.api.FontStyle;
import neofontrender.api.NeoFontRenderApi;
import neofontrender.api.RenderingEngine;
NeoFontRenderApi.updateFont()
.font("Noto Sans SC")
.fallbackFonts("Noto Color Emoji", "SansSerif")
.size(8.5F)
.style(FontStyle.PLAIN)
.engine(RenderingEngine.COSMIC)
.apply();Use .persist(false) for a session-only change. font(...) clears Cosmic's per-style face overrides
so the selected family applies consistently across backends. Use primaryFont(...) together with
cosmicFaceOverrides(...) when a mod needs separate regular, bold, italic, and bold-italic font files.
Other entry points:
| Method | Description |
|---|---|
NeoFontRenderApi.setPrimaryFont(String) |
Convenience: select one font across all backends and persist. |
NeoFontRenderApi.reload() |
Schedule a backend reload without modifying config. |
NeoFontRenderApi.getFontState() |
Immutable snapshot of the configured font and active backend. |
Register or switch the legacy 16-color palette used by Minecraft's §0–§f formatting codes. Useful
for mods that override FontRenderer.colorCode with custom colors or resource packs.
// Register a custom palette provider
NeoFontRenderApi.registerTextColorPaletteProvider(myProvider);
// Switch to a specific provider (auto, vanilla, runtime, custom, or a registered id)
NeoFontRenderApi.selectTextColorPaletteProvider("myprovider");
// Set a custom 16-entry palette
NeoFontRenderApi.setCustomTextColorPalette("FF0000,00FF00,0000FF,...");| Method | Description |
|---|---|
registerTextColorPaletteProvider(provider) |
Register a palette provider for the session. |
selectTextColorPaletteProvider(id) |
Switch the active provider. |
setCustomTextColorPalette(colors) |
Store 16 or 32 RGB hex colors for the custom provider. |
invalidateTextColorPaletteProviders() |
Force re-resolution after a provider's internal state changes. |
Engine-independent API for rendering text at a true logical font size. Works with Cosmic, SFR/AWT, and the modern AWT adapter — the caller does not need to know which backend is active. All methods that create or draw a layout must run on the client render thread.
import neofontrender.api.text.ModernTextApi;
if (ModernTextApi.isAvailable()) {
float advance = ModernTextApi.draw("Hello", x, y, 12.0F, 0xFFFFFFFF);
}| Method | Description |
|---|---|
isAvailable() |
Returns true when a modern text backend is ready. |
layoutFormatted(text, fontSize, argb, shadow) |
Shape and rasterize Minecraft-formatted text into a draw-ready ModernTextLayout. |
layoutFormattedWithShadow(text, fontSize, argb) |
Foreground + blurred modern shadow in one layout. |
measureFormatted(text, fontSize, argb, shadow) |
Horizontal advance in GUI pixels. |
drawFormatted(text, x, y, fontSize, argb, shadow) |
Convenience draw + advance return. |
canRenderModernShadow(text) |
Check whether the current backend supports the modern blurred shadow for all glyphs. |
Scoped variant where the caller chooses the backend and font family via FontRenderSpec. Use when
the mod needs explicit control over which renderer is used (e.g. for a custom HUD element that
should always use Cosmic regardless of the user's global setting).
import neofontrender.api.text.AdvancedTextApi;
import neofontrender.api.text.FontRenderSpec;
FontRenderSpec spec = FontRenderSpec.builder()
.backend(FontRenderBackend.COSMIC)
.family("Noto Sans SC")
.size(10.0F)
.build();
if (AdvancedTextApi.isAvailable(spec)) {
AdvancedTextApi.drawFormatted(text, x, y, 0xFFFFFFFF, false, spec);
}drawWrapped(text, x, y, width, color, spec) renders word-wrapped text within a pixel width
constraint, returning true if the backend was available.
Other client mods can register a data provider that adds a bar to NFR's Arc3D-powered HUD. A
provider selects a Forge element slot and side, returns a HudBarValue, and defaults to reserving
space without canceling vanilla rendering. Only providers that explicitly return true from
replacesVanilla() may replace that element. Namespaced ids and deterministic ordering allow
multiple integrations to share one height stack.
import neofontrender.addons.hud.api.*;
HudBarRegistry.register(new HudBarProvider() {
@Override public String id() { return "mymod:mana"; }
@Override public HudBarElement element() { return HudBarElement.FOOD; }
@Override public HudBarSide side() { return HudBarSide.LEFT; }
@Override public HudBarValue currentValue() {
return new HudBarValue(getMana(), getMaxMana(), 0xFF4488FF);
}
});Dependent mods can add custom tabs to NFR's modular settings screen and contribute lines to the About and Licenses pages.
Settings tab — implement NfrSettingsPage and register it:
import neofontrender.api.client.settings.*;
NfrSettingsPageRegistry.register(new NfrSettingsPage() {
@Override public String id() { return "mymod:settings"; }
@Override public String titleKey() { return "mymod.gui.settings"; }
@Override public int order() { return 100; }
@Override public IWidget buildWidget(NfrSettingsPageContext ctx) {
return new MySettingsPanel();
}
});About / Licenses contribution — add lines to the existing info pages:
NfrInfoPageRegistry.register(new NfrInfoPageContribution() {
@Override public String id() { return "mymod:about"; }
@Override public NfrInfoPage page() { return NfrInfoPage.ABOUT; }
@Override public List<NfrInfoLine> lines() {
return Arrays.asList(
NfrInfoLine.spaced("My Mod v1.0", 0xFFFFFF),
NfrInfoLine.line("github.com/example/mymod", 0x00DCE8));
}
});Factory for TOML configuration files that follow NFR's conventions (auto-save, validation, default
values). Use NfrConfigStorage.INDEPENDENT for a standalone file, or APPEND_TO_NFR to add keys
to NFR's own config.
import neofontrender.api.config.*;
NfrConfigFile config = NfrConfigApi.builder("mymod").open();
config.define("mymod.greeting", "Hello", "Greeting message.");
String greeting = config.getString("mymod.greeting", "Hello");
config.save();Stable access point for the Arc3D Core 2026.2.0 distributed by NFR. The original icyllis.arc3d.*
API is also available and never relocated.
| Method | Description |
|---|---|
isAvailable() |
Returns true when Arc3D Core is loaded and functional. |
lerp(from, to, amount) |
Linear interpolation. |
hsv(h, s, v, alpha) |
HSV to ARGB color conversion. |
lerpArgb(from, to, amount) |
Per-channel ARGB interpolation. |
- TinkersAntique — PUA marker compatibility and enchantment table font replacement.
- SFR/AWT — built-in Java2D AWT compatibility renderer for troubleshooting when Cosmic is unavailable.
- HEI / Obscure Tooltips / Quark — Modern Tooltips integrates with these mods for consistent rendering.
- Backported items — spyglasses, crossbows and tridents from 1.17+ are recognized by exact item
IDs from the bundled
assets/neofontrender_ui_enhancements/crosshair_compat.tomllist and the additive config fields. - Matter Overdrive — the ranged item list includes Matter Overdrive's explicit weapon IDs.
- Shoulder Surfing crosshair offset — Shoulder Surfing's default behavior translates the entire
HUD matrix, causing the crosshair to drift from the actual cursor position. Enable UIE's custom
crosshair to fix this:
patchedmode confines the offset to the actual cursor and synchronizes block/entity picking with the projected crosshair ray, making world interaction feel like vanilla first-person. Other modes:adaptive(switch by held item),static(shoulder-camera center picking),dual(player/camera cursors with interaction marker),off(original behavior).
The project uses the current CleanroomModTemplate: Gradle 9.6, Unimined, Cleanroom Loader, and a Java 25 toolchain.
./gradlew runClient
./gradlew build
./gradlew packageVariantspackageVariants creates the full, core, and resources distribution jars in build/libs. The local build compiles the Cosmic JNI library with Cargo; CI assembles a multi-platform native bundle.
- License: MIT
- Contributors: AndreaFrederica, baka-gourd, DHJComical
- Design notes: docs





