# 機能設計書 204-PopClipRect

## 概要

本ドキュメントは、ImGuiライブラリにおける `PopClipRect` 関数の機能設計を定義する。この関数は、`PushClipRect`でプッシュされたクリッピング矩形をスタックからポップし、以前のクリッピング状態を復元する。

### 本機能の処理概要

PopClipRect関数は、PushClipRectでプッシュされたクリッピング矩形をスタックから削除し、一つ前のクリッピング状態を復元する。これにより、クリッピング領域が親の領域に戻される。

**業務上の目的・背景**：PushClipRectと対になる終了関数として、クリッピング範囲を明確に定義するために必要である。ImGuiのスタックベースのアーキテクチャでは、Push系関数には必ず対応するPop系関数が必要であり、これによりスコープの整合性が保たれる。

**機能の利用シーン**：
- PushClipRectで開始したクリッピング領域の終了
- ネストしたクリッピング領域からの復帰
- カスタム描画完了後のクリッピング状態リセット
- 条件付きクリッピング範囲の解除

**主要な処理内容**：
1. ウィンドウの描画リスト（DrawList）からクリップ矩形をポップ
2. ウィンドウのClipRectをDrawListのクリップ矩形スタックの最新値に更新
3. 以降の描画とヒットテストが復元された矩形内で行われる

**関連システム・外部連携**：PushClipRect関数、ImDrawList、ウィンドウシステム、マウスホバー検出システムと連携する。

**権限による制御**：本機能自体に権限制御はない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 20 | Custom Rendering | 主画面 | カスタム描画領域でのクリッピング終了 |
| 24 | Layout | 参照画面 | レイアウト制御でのクリッピング終了 |

## 機能種別

描画制御 / クリッピング / スタック操作

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| なし | - | - | パラメータなし | - |

### 入力データソース

ImGuiWindowの内部状態（DrawListのクリップ矩形スタック）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| なし | void | 戻り値なし |

### 出力先

- ImDrawListのクリップ矩形スタック（ポップ後の状態）
- ImGuiWindowのClipRect（復元された値）

## 処理フロー

### 処理シーケンス

```
1. 現在のウィンドウを取得
   └─ GetCurrentWindow()を呼び出し
2. DrawListからクリップ矩形をポップ
   └─ window->DrawList->PopClipRect()を呼び出し
3. ウィンドウのClipRectを更新
   └─ DrawListのクリップ矩形スタックの最新値をwindow->ClipRectに設定
```

### フローチャート

```mermaid
flowchart TD
    A[PopClipRect呼び出し] --> B[GetCurrentWindow]
    B --> C[DrawList->PopClipRect]
    C --> D[ClipRectStack.pop_back]
    D --> E[window->ClipRect更新]
    E --> F[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-204-1 | ペア呼び出し | PushClipRectと必ずペアで呼び出す必要がある | 常時 |
| BR-204-2 | スタック整合性 | PopClipRectの呼び出し回数がPushClipRectを超えてはならない | 常時 |
| BR-204-3 | 状態復元 | ポップ後は直前のクリップ矩形が有効になる | 常時 |

### 計算ロジック

特になし（スタックのポップ操作のみ）

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

### 操作別データベース影響一覧

本機能はデータベース操作を行わない（純粋なUI制御機能）。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| なし | 未定義動作 | PushClipRectなしでPopClipRect呼び出し | スタックが空の場合は未定義動作。対応するPushClipRectを追加 |

### リトライ仕様

リトライ機能なし（即時処理）

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

トランザクション管理なし（UI状態のスタック操作）。PushClipRect/PopClipRectは必ずペアで使用する。

## パフォーマンス要件

- 軽量な処理（スタックポップとポインタ更新のみ）
- オーバーヘッドは最小限

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

- スタック操作の整合性は重要だが、セキュリティ上のリスクはない
- 不正なPopClipRect呼び出しは未定義動作となる可能性がある

## 備考

- ImDrawList::PopClipRectも同時に呼び出される
- ウィンドウのClipRectは描画だけでなくヒットテストにも使用される

---

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

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

### 推奨読解順序

#### Step 1: API宣言を理解する

公開APIの宣言を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui.h | `imgui.h` | PopClipRect関数の宣言（991行目） |

**主要処理フロー**:
- **991行目**: PopClipRect関数宣言（パラメータなし）

#### Step 2: 実装を理解する

PopClipRect関数の実装詳細を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui.cpp | `imgui.cpp` | PopClipRect関数の実装（5840-5845行目） |

**主要処理フロー**:
- **5840行目**: 関数定義の開始
- **5842行目**: GetCurrentWindow()で現在のウィンドウを取得
- **5843行目**: DrawList->PopClipRectの呼び出し
- **5844行目**: window->ClipRectの更新

#### Step 3: DrawListの実装を理解する

低レベルのクリップ矩形処理を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui_draw.cpp | `imgui_draw.cpp` | ImDrawList::PopClipRectの実装 |

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

```
ImGui::PopClipRect()
    │
    ├─ GetCurrentWindow()
    │
    ├─ window->DrawList->PopClipRect()
    │      │
    │      └─ _ClipRectStack.pop_back()
    │
    └─ window->ClipRect = _ClipRectStack.back()
```

### データフロー図

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

DrawList._ClipRectStack ─▶ PopClipRect() ───────▶ ClipRectStack更新
                              │
                              └─────────────────▶ window.ClipRect復元
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダ | 公開API宣言 |
| imgui.cpp | `imgui.cpp` | ソース | ImGui::PopClipRect実装 |
| imgui_draw.cpp | `imgui_draw.cpp` | ソース | ImDrawList::PopClipRect実装 |
| imgui_demo.cpp | `imgui_demo.cpp` | ソース | 使用例（5170行目） |
