---
name: icon_font
kind: function
lang: cpp
domain: core
version: "1.0.0"
purity: impure
signature: "void fn_ui::load_default_fonts(float size_px = 13.0f)"
description: "Carga Karla-Regular (texto vectorial) + mergea Tabler Icons al mismo tamaño en el atlas de ImGui. Tras esta llamada los TI_* (icons_tabler.h) renderizan inline con el texto."
tags: [imgui, fonts, icons, tabler, atlas, init]
uses_functions: ["app_settings_cpp_core"]
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [imgui, cstdio, cstdlib, cstring, string]
tested: false
tests: []
test_file_path: ""
file_path: "cpp/functions/core/icon_font.cpp"
framework: imgui
params:
  - name: size_px
    desc: "Tamaño en px compartido por texto e iconos. Default 13 = ImGui default historico, render vectorial nitido en Karla y Tabler. El icon merge cuadra el line-height con el texto al usar el mismo tamaño"
output: "void — texto + iconos quedan activos en io.Fonts. Si Karla no se encuentra, fallback a ProggyClean default; si Tabler no se encuentra, los TI_* salen como cuadritos. Estado consultable via text_font_loaded() y tabler_font_loaded()"
notes: "consumido por cpp/framework/app_base.cpp"
---

# icon_font

Carga la fuente de texto + iconos Tabler en el atlas de ImGui de forma que `TI_*` (de `core/icons_tabler.h`) y texto se mezclen en el mismo glyph stream:

```cpp
icon_button("##rl", TI_REFRESH, "Reload");
button(TI_DEVICE_FLOPPY " Save", V::Primary);  // icono + texto en la misma label
```

## Cuando llamarla

Una sola vez por contexto ImGui, despues de `ImGui::CreateContext()` y antes del primer `ImGui::NewFrame()`. La llamada ya esta hecha automaticamente por `fn::run_app` (`framework/app_base.cpp`). En apps que NO usan `fn::run_app`, llamar manualmente:

```cpp
ImGui::CreateContext();
fn_ui::load_default_fonts();
// ... resto del setup
```

## Fuentes cargadas

| Rol | TTF | Origen | Render |
|---|---|---|---|
| Texto | `Karla-Regular.ttf` (17 KB) | `cpp/vendor/imgui/misc/fonts/` (vendoreado por ImGui) | vectorial, humanist sans-serif, OversampleH=2 |
| Iconos | `tabler-icons.ttf` (2.7 MB) | `cpp/vendor/tabler-icons/` (Tabler v3.41.1, MIT) | vectorial, mergeado en el mismo `ImFont` con `MergeMode = true`, range U+E000..U+FCFF |

Los dos al mismo `size_px` para que el line-height sea uniforme. ImGui no aplica hinting nativo, pero Karla a 13 px con `OversampleH=2` queda nitida.

## Resolucion del path de las TTF

Para cada TTF, busca en este orden (primer match gana):

1. `./<filename>` (cwd / junto al exe en deploys)
2. `./assets/<filename>`
3. `$FN_ASSETS_DIR/<filename>` (override manual)
4. `${FN_CPP_ROOT}/<repo_subpath>` — compile-time define inyectado por CMake:
   - Karla → `vendor/imgui/misc/fonts/Karla-Regular.ttf`
   - Tabler → `vendor/tabler-icons/tabler-icons.ttf`

Si Karla no se encuentra, fallback automatico a `io.Fonts->AddFontDefault()` (ProggyClean bitmap) — la app arranca igual, solo cambia la tipografia. Si Tabler no se encuentra, los `TI_*` salen como cuadritos vacios pero el texto sigue funcionando.

## CMake

Un app que use `add_imgui_app` ya hereda el define `FN_CPP_ROOT` y la copia post-build de la TTF. Si compilas a mano:

```cmake
target_compile_definitions(my_app PRIVATE FN_CPP_ROOT="${CMAKE_SOURCE_DIR}")
```

## Range cubierto

`U+E000..U+FCFF` — Private Use Area, donde Tabler v3.41 ubica todos sus glyphs (rango real efectivo aprox U+EA5E..U+FC93, pero cubrimos toda la PUA por margen).

## Tamaño del atlas

Cargar 5093 iconos a 13 px crea un atlas de aprox 2048x2048 px en memoria de GPU. Si necesitas un atlas mas pequeño, edita el array `tabler_ranges[]` en `.cpp` para cubrir solo los iconos que uses (ej: `{0xEA5E, 0xEC00, 0}`).

## Ejemplo

```cpp
#include "core/icons_tabler.h"
#include "core/button.h"
#include "core/icon_button.h"

if (button(TI_PLUS " New",       V::Primary)) create();
if (button(TI_DEVICE_FLOPPY " Save", V::Secondary)) save();
if (icon_button("##del", TI_TRASH,    "Delete")) confirm();
if (icon_button("##cfg", TI_SETTINGS, "Settings")) open_settings();
```
