# 画面設計書 8-Font Atlas

## 概要

フォントアトラス（フォントテクスチャ）の情報を表示・管理するセクションの設計書である。フォントの読み込み状態、フォントローダーの設定、フォントサイズの調整等を行える。

### 本画面の処理概要

Font Atlasセクションは、ImGuiで使用されているフォントアトラスの詳細情報を表示し、フォントローダー（stb_truetype/FreeType）の切り替え、フォントサイズの調整、個々のフォント情報の確認等を行えるデバッグ/設定UIである。

**業務上の目的・背景**：ImGuiのフォントシステムは複雑であり、開発者がフォントの読み込み状態を確認したり、フォントサイズをリアルタイムで調整したり、フォントローダーを切り替えたりする必要がある。このセクションはMetrics/Debugger Windowの一部として、またはDemo Window内のConfigurationセクションで表示される。

**画面へのアクセス方法**：
1. Metrics/Debugger WindowのFontsセクション内
2. Demo WindowのConfigurationセクション内
3. コード内で直接`ImGui::ShowFontAtlas(atlas)`を呼び出す

**主要な操作・処理内容**：
1. RendererHasTexturesフラグの確認
2. FontSizeBaseでフォントサイズを調整
3. FontScaleMain/FontScaleDpiでスケールを調整
4. フォントローダー（stb_truetype/FreeType）を切り替え
5. 各フォントの詳細情報を確認

**画面遷移**：
- 遷移元：Metrics/Debugger Window、Demo Window（Configuration）
- 遷移先：なし

**権限による表示制御**：なし

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 51 | PushFont | 主機能 | フォントのプッシュ |
| 52 | PopFont | 主機能 | フォントのポップ |
| 53 | GetFont | 主機能 | 現在のフォント取得 |
| 54 | GetFontSize | 主機能 | フォントサイズの取得 |
| 100 | Image | 補助機能 | フォントアトラステクスチャの表示 |

## 画面種別

デバッグ/設定画面

## URL/ルーティング

N/A（Immediate Mode GUIのため、URLやルーティングの概念は適用されない）

## 入出力項目

| 項目名 | 型 | 入力/出力 | 必須 | 説明 |
|--------|-----|----------|------|------|
| atlas | ImFontAtlas* | 入力 | 必須 | 表示対象のフォントアトラス |

## 表示項目

| 項目名 | 説明 |
|--------|------|
| RendererHasTexturesチェックボックス | バックエンドのテクスチャサポート状態（読み取り専用） |
| Fontsセレクタ | フォント選択 |
| FontSizeBase | 基本フォントサイズ調整 |
| FontScaleMain | メインフォントスケール調整 |
| FontScaleDpi | DPIフォントスケール調整 |
| 警告メッセージ | RendererHasTextures未設定時の警告 |
| Loaderセクション | フォントローダー選択（stb_truetype/FreeType） |
| Font Listセクション | 各フォントの詳細情報 |
| フォントプレビュー | フォントのプレビュー表示（オプション） |

## イベント仕様

### 1-FontSizeBase変更

FontSizeBaseドラッグスライダーを操作すると、style.FontSizeBaseが更新され、次フレームからフォントサイズが変更される。

### 2-FontScale変更

FontScaleMain/FontScaleDpiドラッグスライダーを操作すると、対応するスタイル値が更新される。

### 3-フォントローダー切り替え

Loaderセクションでstb_truetypeまたはFreeTypeを選択すると、atlas->SetFontLoader()が呼ばれ、フォントローダーが切り替わる。既存のフォントは再読み込みされる。

### 4-フォントプレビュー表示

「Show font preview」チェックボックスを有効にすると、各フォントのプレビューテキストが表示される。

## データベース更新仕様

N/A（Dear ImGuiはUIライブラリであり、データベース操作は行わない）

## メッセージ仕様

| メッセージ | 条件 | 説明 |
|-----------|------|------|
| Warning: Font scaling will NOT be smooth | RendererHasTextures未設定 | スムーズなフォントスケーリングにはバックエンド対応が必要 |
| Load a nice font for better results! | 常時 | フォント読み込みの推奨 |

## 例外処理

なし

## 備考

- ShowFontAtlasは内部関数（IMGUI_API）だが、デモコードから呼び出される
- IMGUI_ENABLE_STB_TRUETYPEとIMGUI_ENABLE_FREETYPEの定義によって利用可能なフォントローダーが決まる
- フォントローダーの切り替えはRendererHasTexturesが有効な場合のみ可能
- IMGUI_DISABLE_DEBUG_TOOLSマクロが定義されている場合、この関数は空実装になる

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

フォントアトラスの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui.h | `imgui.h` | ImFontAtlas構造体でフォントアトラスを定義 |
| 1-2 | imgui.h | `imgui.h` | ImFont構造体で個々のフォントを定義 |

**読解のコツ**: ImFontAtlasはFonts[]ベクター、TexData、FontLoader等を保持する。ImFontは個々のフォントの情報を保持する。

#### Step 2: エントリーポイントを理解する

ShowFontAtlas関数がFont Atlasセクションの描画処理のエントリーポイント。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui.cpp | `imgui.cpp` | ShowFontAtlas()関数（行16215以降）がエントリーポイント |

**主要処理フロー**:
1. **行16221-16223**: RendererHasTexturesチェックボックス（disabled）
2. **行16224-16232**: FontSelector、FontSizeBase、FontScaleの調整
3. **行16235-16247**: 警告メッセージとドキュメントリンク
4. **行16255-16295**: Loaderセクション（フォントローダー選択）
5. **行16298-**: Font Listセクション（各フォントの詳細）

#### Step 3: フォントローダー関連を理解する

フォントローダーの切り替え処理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui.cpp | `imgui.cpp` | ImFontAtlas::SetFontLoader()関数 |
| 3-2 | imgui_freetype.cpp | `imgui_freetype.cpp` | FreeTypeローダーの実装（オプション） |

### プログラム呼び出し階層図

```
ImGui::ShowFontAtlas(ImFontAtlas* atlas)
    |
    +-- BeginDisabled()
    +-- CheckboxFlags("RendererHasTextures", ...)
    +-- EndDisabled()
    |
    +-- ShowFontSelector("Font")
    +-- DragFloat("FontSizeBase", ...)
    +-- DragFloat("FontScaleMain", ...)
    +-- DragFloat("FontScaleDpi", ...)
    |
    +-- [RendererHasTextures == false]
    |       +-- BulletText("Warning...")
    |       +-- TextLinkOpenURL("docs/BACKENDS.md")
    |
    +-- SeparatorText("Font List")
    |
    +-- Checkbox("Show font preview", ...)
    |
    +-- TreeNode("Loader")
    |       +-- RadioButton("stb_truetype")
    |       |       +-- atlas->SetFontLoader(loader_stbtruetype)
    |       +-- RadioButton("FreeType")
    |       |       +-- atlas->SetFontLoader(loader_freetype)
    |
    +-- [各フォントについてループ]
    |       +-- DebugNodeFont()
```

### データフロー図

```
[入力]                        [処理]                         [出力]

atlas (ImFontAtlas*) ────▶ ShowFontAtlas() ───────────────▶  フォント情報表示
                                  |
io.BackendFlags    ────▶         |  ───▶ RendererHasTextures状態
                                  |
style.FontSizeBase ◀────▶       |  ◀──── フォントサイズ調整
style.FontScaleMain ◀───▶       |
style.FontScaleDpi  ◀───▶       |
                                  |
atlas->FontLoader  ◀────▶       |  ◀──── ローダー切り替え
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.cpp | `imgui.cpp` | ソース | ShowFontAtlas()の実装 |
| imgui.h | `imgui.h` | ヘッダー | ImFontAtlas、ImFont構造体定義 |
| imgui_freetype.cpp | `imgui_freetype.cpp` | ソース | FreeTypeフォントローダーの実装（オプション） |
