Releases: Master-Antonio/Puretype
v0.1.0-alpha
New UI
New icon
Added multi monitor support
Added multi profiles app support
Changes in rendering pipeline to have sharper text
Added font optimized for OLED (you can enable it on System Font)
Full changes: v0.0.8-alpha...v0.1.0-alpha
v0.0.8-alpha
Core Engine Updates (C++):
- Implemented
oledGammaOutputcorrection in the GDI Pass 3. This crushes excessively glowing mid-tones caused by standard LCD alpha-blending logic when compositing against true 0.0 nit OLED black levels. - Added Font-Weight awareness to the
ToneMapper. The S-Curve contrast boost now dynamically scales down for thin/light fonts (weight < 400), ensuring the fine details preserved by Stem Darkening are not crushed by the readability contrast pass.
UI & Configuration (WPF / .ini):
- Added an "OLED gamma correction" slider to
PuretypeUIunder Tone Mapping, allowing real-time preview of the mid-tone crushing effect. - Updated the "Apply recommended" preset logic to automatically configure optimal OLED gamma values (1.20 for WOLED, 1.15 for QD-OLED, 1.00 for LCD).
v0.0.7-alpha
Core Engine Updates (C++):
- Implemented font-weight-aware Stem Darkening in the GDI path to prevent ultra-thin fonts from appearing harsh on high color-volume panels (QD-OLED).
- Added WOLED Cross-Talk Reduction to suppress chromatic aberration caused by the physical white subpixel stealing energy from R/G/B.
- Tuned Fractional Subpixel Positioning offsets specifically for the rectangular matrix of QD-OLED Gen 3 & Gen 4.
- Extended the Preview Bridge to accurately render Gamma Mode (sRGB vs OLED) in the UI.
UI & Configuration (WPF / .ini):
- Expanded the UI Panel Selection to explicitly cover WOLED (RWBG/RGWB) and QD-OLED (Gen 1-4).
- Added UI controls for Gamma Mode and High DPI fade-out thresholds (Start/End).
- Added a "✦ Apply recommended" button to safely load optimal settings (crosstalk, stem darkening, Luma contrast) for the selected panel without automatically erasing user customizations.
- Completely restructured puretype.ini documentation to reflect the new capabilities.
v0.0.6-alpha
Full Changelog: v0.0.5-alpha...v0.0.6-alpha
Fix black background bug on desktop
Fix dangerous code can cause crashes
Added new panel types with real evaluation using rtings microscopic photos
v0.0.5-alpha
Added UI for settings
Full Changelog: v0.0.4-alpha...v0.0.5-alpha
v0.0.4-alpha [Proof of Concept]
OLED subpixel rendering that works on every Windows application — no configuration of system ClearType required.
What's new in v0.0.4
Universal compatibility — GDI hook rewritten from scratch
The v0.0.3 GDI hook replaced GDI rendering entirely with a custom FreeType rasterizer. This broke any application that pre-computed its own layout metrics before calling ExtTextOutW — Qt, MFC, WPF, VoiceMeeter, EqualizerAPO, and many others produced clipped or illegible text.
v0.0.4 switches to a post-processing architecture: GDI renders normally with all its own metrics intact, and PureType modifies only the resulting pixel values. Every framework's bounding boxes and advance widths remain valid because GDI itself produced them.
v0.0.3: intercept → block GDI → FreeType rasterize → OLED blit ← breaks Qt/MFC/WPF
v0.0.4: intercept → capture before → GDI renders → capture after → remap pixels
Works with ClearType off
PureType's OLED remapping requires per-channel R/G/B subpixel data from GDI. When ClearType is disabled system-wide (grayscale AA or no AA), GDI writes identical values to all three channels — no subpixel information is present.
v0.0.4 solves this with ForceSubpixelRender: before each GDI call, the current font is temporarily cloned with lfQuality = CLEARTYPE_QUALITY and selected into the DC. GDI renders with ClearType for that single call. The original font is restored immediately after capture, before any pixels are written back. Since lfQuality does not affect glyph metrics, framework layout remains unaffected.
The output is visually equivalent whether ClearType was already active or had to be forced — CreateFontIndirectW with CLEARTYPE_QUALITY respects the same system registry tuning (gamma, pixel geometry, contrast) in both cases.
WOLED cross-talk reduction now applied
woledCrossTalkReduction was read from puretype.ini and validated, but the value was never passed to the filter. The W subpixel on LG WOLED panels drives R, G, and B simultaneously via TCON hardware. Without attenuation, this produces a grey luminance haze on dark backgrounds.
Fixed formula:
w_reduced = alpha_W × (1 − crossTalk)
final_ch = max(alpha_ch, w_reduced)
Default crossTalk = 0.08 attenuates the W contribution to 92% before the max() merge.
QD-OLED triangular geometry modelled correctly
The TriangularFilter was applying a horizontal-only FIR pass — identical to the WOLED filter, just with 5 taps instead of 7. Samsung QD-OLED panels (Dell AW3423DW, Odyssey G8, Sony InZone M9 II) use a triangular subpixel arrangement where even and odd rows are offset by ±1.5 subpixels horizontally. The filter now blends 25% from the adjacent row at the correct shift:
even row: sample = 0.75 × row[y][x] + 0.25 × row[y+1][x + 1.5 subpx]
odd row: sample = 0.75 × row[y][x] + 0.25 × row[y−1][x − 1.5 subpx]
Correct FreeType hinting per panel type
FT_LOAD_TARGET_LCD biases stem edges toward horizontal subpixel boundaries — correct for RWBG/RGWB stripe panels, wrong for QD-OLED triangular geometry where subpixels are not arranged in a horizontal row.
| Panel | v0.0.3 | v0.0.4 |
|---|---|---|
| RWBG / RGWB | FT_LOAD_TARGET_LCD |
FT_LOAD_TARGET_LCD ✓ |
| QD-OLED triangular | FT_LOAD_TARGET_LCD ✗ |
FT_LOAD_TARGET_NORMAL ✓ |
Both paths continue to use FT_RENDER_MODE_LCD for the 3× oversampled bitmap.
chromaKeep corrected for OLED
The tone-mapper's chromaKeep values (which control how much per-channel subpixel colour is preserved vs collapsed to luma) were ported from an LCD tone-mapper. On LCD, suppressing subpixel chroma reduces fringing artefacts. On OLED the per-channel colour is the rendering mechanism — discarding it neutralises the entire subpixel correction.
| Size | v0.0.3 (RWBG) | v0.0.4 (RWBG) |
|---|---|---|
| ≤ 18 px | 35% | 72% |
| 19–24 px | 40% | 77% |
| 25–32 px | 50% | 82% |
| > 32 px | 24% | 85% |
The v0.0.3 value of 24% for large text meant that headings received less subpixel benefit than body text — the opposite of what is correct, since wide stems benefit most from full per-channel blending.
WOLED FIR filter reduced from 7-tap to 3-tap
The 7-tap FIR (1+2+3+4+3+2+1)/16 has an effective span of 7/4 = 1.75 physical pixels across WOLED's 4-slot layout. This caused visible horizontal colour fringing on thin strokes as energy bled into adjacent pixels.
The 3-tap (0.25+0.50+0.25) spans 0.75 physical pixels — sufficient to smooth quantisation artefacts without inter-pixel crosstalk.
Bug fixes summary
| # | Component | Description |
|---|---|---|
| 1 | gdi_hooks.cpp |
GDI hook rewritten: post-process architecture replaces FreeType-render approach |
| 2 | gdi_hooks.cpp |
ForceSubpixelRender: ClearType forced per-call so remap works with system AA off |
| 3 | filters/subpixel_filter.cpp |
woledCrossTalkReduction applied in WOLEDFilter; was parsed but never used |
| 4 | filters/subpixel_filter.cpp |
TriangularFilter: 2D row blending models QD-OLED triangular geometry |
| 5 | filters/subpixel_filter.cpp |
WOLED FIR reduced 7-tap → 3-tap; eliminates inter-pixel colour fringing |
| 6 | rasterizer/ft_rasterizer.cpp |
FT_LOAD_TARGET_NORMAL for QD-OLED; FT_LOAD_TARGET_LCD for stripe panels |
| 7 | filters/tone_mapper.cpp |
chromaKeep raised to 0.70–0.85; v0.0.3 values (0.18–0.50) discarded subpixel data |
Framework compatibility
| Framework / renderer | v0.0.3 | v0.0.4 |
|---|---|---|
| Win32 / MFC / WinForms | ✅ | ✅ |
| Qt5 / Qt6 (EqualizerAPO, Peace…) | ❌ text clipped | ✅ |
| WPF with GDI fallback | ❌ text clipped | ✅ |
| VoiceMeeter / VST host | ❌ text clipped | ✅ |
| CJK IME (Microsoft IME, ATOK…) | ❌ text clipped | ✅ |
| Notepad / Notepad++ | ✅ | ✅ |
| Legacy 32-bit apps | ❌ text clipped | ✅ |
| DirectWrite + Direct2D | ✅ | ✅ |
| System ClearType off | ❌ no subpixel data | ✅ |
Installation
- Download
puretype.zipand extract to a permanent directory (e.g.C:\PureType\). - Edit
puretype.iniand setpanelTypeto match your display:rwbg— LG WOLED (most LG C/G/B OLED monitors and TVs used as monitors)rgwb— LG WOLED with swapped W/B order (some 32" LG models)qd_oled_triangle— Samsung QD-OLED (Dell AW3423DW, Odyssey G8 OLED, Sony InZone M9 II)
- Run
puretype.exe(or configure autostart via Task Scheduler / registry run key).
No system-wide ClearType settings need to be changed.
v0.0.3-alpha [Proof of Concept]
⚠️ WARNING: Experimental Release (Alpha)
This is a Proof of Concept. The software uses system-level API Hooking and DLL Injection to bypass Microsoft's native ClearType rendering. It is not yet ready for daily driver use. You may experience visual glitches, flickering, or unexpected crashes in unsupported applications. Use at your own risk.
Changelog
Various fixes for oled in general, changes to algorithm
Actually have problems with rendering in application with intern engine like the QT Application
v0.0.1-alpha [Proof of Concept]
⚠️ WARNING: Experimental Release (Alpha)
This is a Proof of Concept. The software uses system-level API Hooking and DLL Injection to bypass Microsoft's native ClearType rendering. It is not yet ready for daily driver use. You may experience visual glitches, flickering, or unexpected crashes in unsupported applications. Use at your own risk.
🧬 Project Status
The core injection engine (injector.exe) and the rendering infrastructure (Puretype.dll) are successfully up and running. The engine can intercept Windows text rendering calls and apply our custom spatial filters.
However, i need the community's help. The mathematical foundation for LG WRGB and Samsung QD-OLED (Triangular) layouts is implemented, but i still need to find the perfect rendering values.
🎯 Call to Action: Tuning the Rendering Values
Currently, the calibration values (convolution kernel weights, linear Gamma curves, and Stem Darkening strength) are just placeholders.
I invite users with OLED panels to test the application (e.g., on notepad.exe) and share feedbacks.
The goal of this phase is to collect visual feedback and macro-photography of the pixels to find the "golden ratio" that guarantees maximum sharpness and zero color fringing.
🛡️ Known Limitations: The Injection Blacklist
To ensure operating system stability and protect users, this release includes a strict, hardcoded blacklist system.
The DLL injection is intentionally blocked from attaching to certain executables. If you notice that some apps still use the old ClearType rendering, they are likely blacklisted.
Currently excluded processes:
- Video Games & Anti-Cheat Engines: (e.g., Vanguard, EasyAntiCheat, BattlEye). Injecting a DLL into competitive games will trigger a ban. SharpType automatically aborts injection here.
- Critical System Processes: (
csrss.exe,lsass.exe,winlogon.exe) to prevent Blue Screens of Death (BSOD). - Certain UWP / Modern Apps: Highly sandboxed applications (AppContainers) might currently ignore the hook or crash if the DLL lacks the
ALL APPLICATION PACKAGESsecurity permissions.
🛠️ How to Test
- Extract the
.ziparchive into a folder. - Run the injector
- Open Notepad (
notepad.exe) or other standard Win32 applications to see the difference. - Share your macro screenshots and the exact configuration values you used in the "Issues" or "Discussions" tab!
v0.0.2-alpha [Proof of Concept]
⚠️ WARNING: Experimental Release (Alpha)
This is a Proof of Concept. The software uses system-level API Hooking and DLL Injection to bypass Microsoft's native ClearType rendering. It is not yet ready for daily driver use. You may experience visual glitches, flickering, or unexpected crashes in unsupported applications. Use at your own risk.
🧬 Project Status
Refactor rendering pipeline: isolate tone mapping and optimize rasterizer
This commit resolves the architectural "double-dipping" conflict and establishes a clean, mathematically rigorous signal processing pipeline.
Key changes:
- Implemented LG Oled support
- Implemented
ToneMappermodule to exclusively handle human visual system (HVS) optimizations (Chroma Crushing and Readability Tone S-Curve), enforcing the Single Responsibility Principle. - Stripped redundant luma and contrast calculations from
blender.cpp. The blender is now strictly responsible for fast, linear-space alpha compositing. - Cleaned up
subpixel_filter.cppto perform pure spatial FIR filtering. Removed the temporary QD-OLED luma injection hack, relying instead on the ToneMapper for mathematically safe stem darkening. - Optimized
ft_rasterizer.cppby reducing thestd::mutexscope. FreeType locks are now released before memory allocation/copying, eliminating UI thread stuttering. - Updated
README.mdto accurately reflect the new rendering pipeline (Phase-Aware Rasterization, TCON Inversion Math, and Perceptual Tone Mapping). - Fixed minor compilation errors (missing
RGBABitmapforward declaration headers and incorrectCreateBitmappointer arguments).
I also published a wiki page, in a completely transparent way, where I explain the entire algorithm of the program so as to encourage discussion and help identify improvements or errors.
https://github.com/Master-Antonio/Puretype/wiki/The-Mathematics-Behind-PureType
🛡️ Known Limitations: The Injection Blacklist
To ensure operating system stability and protect users, this release includes a strict, hardcoded blacklist system.
The DLL injection is intentionally blocked from attaching to certain executables. If you notice that some apps still use the old ClearType rendering, they are likely blacklisted.
Currently excluded processes:
- Video Games & Anti-Cheat Engines: (e.g., Vanguard, EasyAntiCheat, BattlEye). Injecting a DLL into competitive games will trigger a ban. SharpType automatically aborts injection here.
- Critical System Processes: (
csrss.exe,lsass.exe,winlogon.exe) to prevent Blue Screens of Death (BSOD). - Certain UWP / Modern Apps: Highly sandboxed applications (AppContainers) might currently ignore the hook or crash if the DLL lacks the
ALL APPLICATION PACKAGESsecurity permissions.
🛠️ How to Test
- Extract the
.ziparchive into a folder. - Set your config in puretype.ini
- Run puretype.exe
- Open Notepad (
notepad.exe) or other standard Win32 applications to see the difference. - Share your macro screenshots and the exact configuration values you used in the "Issues" or "Discussions" tab!