# 機能設計書 219-GetItemRectMax

## 概要

本ドキュメントは、ImGuiのGetItemRectMax関数の機能設計書である。直前に追加されたアイテムの境界矩形の右下座標を取得する機能について記載する。

### 本機能の処理概要

GetItemRectMax関数は、直前に追加されたウィジェット（アイテム）の境界矩形（bounding rectangle）の右下座標を画面座標（screen space）で取得するAPIである。GetItemRectMinと組み合わせることで、アイテムの完全な矩形領域を把握できる。

**業務上の目的・背景**：カスタム描画やアイテム周辺へのデコレーション（枠線、背景色など）を追加する際に、アイテムの正確な位置とサイズを知る必要がある。特に、ImDrawListを使用してアイテムの周囲に枠線を描画したり、レイアウト計算で次のアイテムの配置位置を決定したりする場合に使用される。

**機能の利用シーン**：
- カスタムウィジェットの境界に枠線や背景を描画する場合
- アイテムの右端位置を基準に次のアイテムを配置する場合
- ボタン等のサイズに合わせた自動レイアウトを実装する場合
- デバッグ目的でアイテムの境界を可視化する場合
- テキストの折り返しテストで境界マーカーを描画する場合

**主要な処理内容**：
1. ImGuiContextから直前のアイテムの矩形情報を取得
2. 矩形のMax座標（右下）を返却

**関連システム・外部連携**：ImGuiの内部状態管理システム（ImGuiContext）のLastItemData.Rect.Maxを参照する。

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | Demo Window | 参照画面 | Querying Statusセクションで矩形情報表示 |
| 20 | Custom Rendering | 参照画面 | カスタム描画での座標取得 |
| 24 | Layout | 参照画面 | レイアウト計算での使用（ボタン配置） |

## 機能種別

情報取得 / クエリ機能

## 入力仕様

### 入力パラメータ

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

### 入力データソース

- ImGuiContext::LastItemData.Rect.Max - 直前に追加されたアイテムの矩形の右下座標

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 戻り値 | ImVec2 | アイテムの境界矩形の右下座標（画面座標系） |

### 出力先

呼び出し元への戻り値として返却

## 処理フロー

### 処理シーケンス

```
1. コンテキスト取得
   └─ ImGuiContextへの参照を取得
2. 矩形情報取得
   └─ g.LastItemData.Rectを参照
3. Max座標返却
   └─ Rect.Maxを返却
```

### フローチャート

```mermaid
flowchart TD
    A[GetItemRectMax呼び出し] --> B[ImGuiContext取得]
    B --> C[g.LastItemData.Rect参照]
    C --> D[Rect.Maxを返却]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-219-01 | 画面座標系 | 返却される座標は画面座標系（screen space）であり、ウィンドウ座標系ではない | 常時 |
| BR-219-02 | 関連関数 | GetItemRectMinと組み合わせて矩形全体を取得できる | 矩形描画時 |
| BR-219-03 | レイアウト活用 | x座標を参照することで、次のアイテムを同じ行に配置するかどうかを判断できる | 自動レイアウト時 |

### 計算ロジック

```cpp
ImVec2 ImGui::GetItemRectMax()
{
    ImGuiContext& g = *GImGui;
    return g.LastItemData.Rect.Max;
}
```

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

該当なし（GUIフレームワーク内部の状態参照のみ）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 暗黙的エラー | 前にアイテムが追加されていない場合 | 初期化されていない値（通常は(0,0)）が返される |

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

- 単純なフィールド参照のみの極めて軽量な処理
- フレームごとに何度呼び出しても問題なし

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

該当なし

## 備考

- ImVec2はxとyの2つのfloatメンバを持つ構造体
- GetItemRectMax().xを使用して、アイテムの右端位置を取得し、自動的な行折り返しを実装するパターンがよく使われる（デモコード参照）
- ImDrawList::AddRect()に直接GetItemRectMin()とGetItemRectMax()を渡すことで、アイテムの境界枠を描画できる

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui.h | `imgui.h` | ImVec2構造体の定義 |
| 1-2 | imgui.h | `imgui.h` | ImRect構造体の定義（Min, Maxメンバ） |
| 1-3 | imgui_internal.h | `imgui_internal.h` | ImGuiLastItemData.Rect（1381行目） |

**読解のコツ**: ImRectは矩形を表す構造体で、Min（左上）とMax（右下）の2つのImVec2で構成される。Max座標は「含まない境界」（exclusive）であることが多い。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui.h | `imgui.h` | 関数宣言（1021行目） |
| 2-2 | imgui.cpp | `imgui.cpp` | 関数実装（6336-6340行目） |

**主要処理フロー**:
1. **6336行目**: 関数定義
2. **6338行目**: ImGuiContext参照の取得
3. **6339行目**: LastItemData.Rect.Maxの返却

#### Step 3: 使用例を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui_demo.cpp | `imgui_demo.cpp` | 矩形情報表示（2162行目） |
| 3-2 | imgui_demo.cpp | `imgui_demo.cpp` | 自動レイアウト（4650行目） |
| 3-3 | imgui_demo.cpp | `imgui_demo.cpp` | 境界描画（3661行目、5160行目） |

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

```
ImGui::GetItemRectMax()
    │
    └─ g.LastItemData.Rect.Max 参照
           └─ ImVec2 を返却
```

### データフロー図

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

ウィジェット追加時 ──▶ ItemAdd()でRect設定
                             │
                             ▼
                    g.LastItemData.Rect
                             │
                             ▼
GetItemRectMax() ─────▶ Max座標取得 ──────▶ ImVec2 (x, y)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui.h | `imgui.h` | ヘッダー | 公開API宣言、ImVec2/ImRect定義 |
| imgui.cpp | `imgui.cpp` | ソース | 関数実装 |
| imgui_internal.h | `imgui_internal.h` | ヘッダー | ImGuiLastItemData構造体定義 |
| imgui_demo.cpp | `imgui_demo.cpp` | デモ | 使用例（2162行目、3661行目、4471行目、4650行目、5160行目） |
