# 機能設計書 83-フォントサイズ変更

## 概要

本ドキュメントは、Ghosttyターミナルエミュレータにおけるフォントサイズ変更機能の設計仕様を記載する。

### 本機能の処理概要

フォントサイズ変更機能は、ターミナル画面に表示されるテキストのフォントサイズを動的に拡大・縮小・リセットする機能である。キーバインドやアクションを通じてリアルタイムでフォントサイズを変更できる。

**業務上の目的・背景**：
プレゼンテーションやペアプログラミングなど、画面を他者と共有する場面では、テキストの視認性を確保するためにフォントサイズを一時的に大きくする必要がある。また、高解像度ディスプレイやDPI変更時に適切なサイズに調整する必要がある。

**機能の利用シーン**：
- プレゼンテーション中にコードを見せる際にフォントサイズを拡大
- 長時間の作業で目の疲れを軽減するためにサイズを調整
- 設定をリセットして元のサイズに戻す
- キーボードショートカット（Cmd++/Cmd+-等）で素早くサイズ変更

**主要な処理内容**：
1. キーバインドアクション（increase_font_size、decrease_font_size、reset_font_size、set_font_size）を受け取る
2. 現在のフォントサイズに対して増減を適用
3. フォントグリッドを新しいサイズで再構築
4. レンダラーに新しいフォントグリッドを通知
5. セルサイズを再計算して画面を更新

**関連システム・外部連携**：
- フォントグリッドセット（SharedGridSet）
- レンダラー（Metal/OpenGL/WebGL）

**権限による制御**：
特に権限による制御はない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | メインターミナルウィンドウ | 主画面 | フォントサイズの変更と表示 |
| 2 | クイックターミナル | 主画面 | フォントサイズの変更と表示 |

## 機能種別

ユーザー操作 / 表示設定

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| delta (increase) | f32 | Yes | 増加するポイント数 | 0-255の範囲でクランプ |
| delta (decrease) | f32 | Yes | 減少するポイント数 | 0-255の範囲でクランプ |
| points (set) | f32 | Yes | 設定するポイントサイズ | 1-255の範囲でクランプ |

### 入力データソース

- キーバインドアクション
- コマンドパレット
- 設定ファイル（初期値）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| font_size | DesiredSize | 新しいフォントサイズ |
| font_metrics | Metrics | 新しいフォントメトリクス |
| cell_size | CellSize | 新しいセルサイズ |

### 出力先

- Surface構造体のfont_size, font_metricsフィールド
- レンダラー（フォントグリッド更新メッセージ）

## 処理フロー

### 処理シーケンス

```
1. アクション受信
   └─ increase_font_size / decrease_font_size / reset_font_size / set_font_size
2. サイズ計算
   ├─ increase: min(current + delta, 255)
   ├─ decrease: max(current - delta, 1)
   ├─ reset: original_font_size
   └─ set: clamp(points, 1, 255)
3. フォントグリッド更新
   └─ SharedGridSet.ref()で新しいグリッドを取得
4. セルサイズ更新
   └─ setCellSize()でセルサイズを再計算
5. レンダラー通知
   └─ RenderMailboxに更新メッセージ送信
6. 画面再描画
   └─ queueRender()でレンダリングをキュー
```

### フローチャート

```mermaid
flowchart TD
    A[アクション受信] --> B{アクション種別}
    B -->|increase_font_size| C[size = min(size + delta, 255)]
    B -->|decrease_font_size| D[size = max(size - delta, 1)]
    B -->|reset_font_size| E[size = original_font_size]
    B -->|set_font_size| F[size = clamp(points, 1, 255)]
    C --> G[setFontSize呼び出し]
    D --> G
    E --> G
    F --> G
    G --> H[SharedGridSet.ref]
    H --> I[setCellSize]
    I --> J[レンダラーに通知]
    J --> K[画面再描画]
    K --> L{reset_font_size?}
    L -->|Yes| M[font_size_adjusted = false]
    L -->|No| N[font_size_adjusted = true]
    M --> O[終了]
    N --> O
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-83-01 | サイズ範囲制限 | フォントサイズは1-255ポイントの範囲に制限 | 常時 |
| BR-83-02 | 手動調整フラグ | サイズ変更後はfont_size_adjusted=trueに設定 | increase/decrease/set時 |
| BR-83-03 | リセット時フラグクリア | reset_font_size時はfont_size_adjusted=falseに設定 | reset時 |
| BR-83-04 | 設定リロード優先度 | font_size_adjusted=trueの場合、設定リロード時にサイズを変更しない | 設定リロード時 |

### 計算ロジック

- increase_font_size: `size.points = min(size.points + delta, 255)`
- decrease_font_size: `size.points = max(size.points - delta, 1)`
- reset_font_size: `size.points = original_font_size`
- set_font_size: `size.points = clamp(points, 1.0, 255.0)`

## データベース操作仕様

本機能はデータベース操作を行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| OutOfMemory | メモリエラー | フォントグリッド生成時 | エラーを上位に伝播 |
| - | 範囲外 | 無効なサイズ指定 | クランプして処理続行 |

### リトライ仕様

リトライは行わない。

## トランザクション仕様

該当なし。

## パフォーマンス要件

- フォントグリッドの再構築はやや重い処理だが、ユーザー操作のため許容範囲
- SharedGridSetによるキャッシュで同一サイズへの変更は高速

## セキュリティ考慮事項

特になし。

## 備考

- DPI変更時もsetFontSizeが呼び出される
- フォントサイズは浮動小数点数（f32）で管理

---

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

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

### 推奨読解順序

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

まず、フォントサイズに関連するデータ構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Surface.zig | `src/Surface.zig` | font_size, font_size_adjustedフィールド（68-75行目） |
| 1-2 | Surface.zig | `src/Surface.zig` | DerivedConfig.original_font_size（295行目） |

**読解のコツ**: `font_size`は現在のサイズ、`original_font_size`は設定ファイルから読み込んだ初期値、`font_size_adjusted`は手動で変更されたかどうかのフラグ。

#### Step 2: アクション処理を理解する

キーバインドアクションの処理ロジック。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Surface.zig | `src/Surface.zig` | increase_font_size処理（5412-5424行目） |
| 2-2 | Surface.zig | `src/Surface.zig` | decrease_font_size処理（5427-5438行目） |
| 2-3 | Surface.zig | `src/Surface.zig` | reset_font_size処理（5441-5449行目） |
| 2-4 | Surface.zig | `src/Surface.zig` | set_font_size処理（5452-5460行目） |

**主要処理フロー**:
- **5412-5424行目**: increase_font_size - デルタをクランプし、サイズを増加、font_size_adjustedをtrueに
- **5427-5438行目**: decrease_font_size - デルタをクランプし、サイズを減少、font_size_adjustedをtrueに
- **5441-5449行目**: reset_font_size - original_font_sizeに戻し、font_size_adjustedをfalseに
- **5452-5460行目**: set_font_size - 指定サイズにクランプして設定、font_size_adjustedをtrueに

#### Step 3: setFontSize関数を理解する

実際のフォントサイズ変更処理。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Surface.zig | `src/Surface.zig` | setFontSize関数（2372-2395行目付近） |

**主要処理フロー**:
- **2377行目**: font_sizeフィールドを更新
- **2380-2383行目**: SharedGridSet.refで新しいフォントグリッドを取得
- **2387行目以降**: setCellSizeでセルサイズを更新

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

```
キーバインドアクション
    │
    ├─ increase_font_size
    │      └─ size.points = min(current + delta, 255)
    │
    ├─ decrease_font_size
    │      └─ size.points = max(current - delta, 1)
    │
    ├─ reset_font_size
    │      └─ size.points = original_font_size
    │
    └─ set_font_size
           └─ size.points = clamp(points, 1, 255)
                  │
                  ▼
           setFontSize(size)
                  │
                  ├─ font_size = size
                  │
                  ├─ SharedGridSet.ref()
                  │      └─ 新しいフォントグリッド取得
                  │
                  └─ setCellSize()
                         └─ セルサイズ再計算
                                │
                                ▼
                         レンダラーに通知
```

### データフロー図

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

キーバインド ───▶ アクション判定 ───▶ サイズ計算
                      │
                      ▼
              setFontSize()
                      │
                      ├──▶ font_size更新
                      │
                      ├──▶ SharedGridSet.ref()
                      │         │
                      │         ▼
                      │    フォントグリッド再構築
                      │
                      └──▶ setCellSize()
                                │
                                ▼
                           セルサイズ更新
                                │
                                ▼
                           レンダラー通知
                                │
                                ▼
                           画面再描画
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Surface.zig | `src/Surface.zig` | ソース | フォントサイズ変更の主要ロジック |
| Binding.zig | `src/input/Binding.zig` | ソース | アクション定義（increase_font_size等） |
| command.zig | `src/input/command.zig` | ソース | コマンドパレット用コマンド定義 |
| SharedGrid.zig | `src/font/SharedGrid.zig` | ソース | フォントグリッドの共有管理 |
| Config.zig | `src/config/Config.zig` | ソース | font-size設定の定義 |
| generic.zig | `src/renderer/generic.zig` | ソース | レンダラーでのフォントグリッド受信 |
