# 機能設計書 220-GetItemRectSize

## 概要

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

### 本機能の処理概要

GetItemRectSize関数は、直前に追加されたウィジェット（アイテム）の境界矩形（bounding rectangle）のサイズを取得するAPIである。これは内部的にはGetItemRectMax() - GetItemRectMin()と同等であり、アイテムの幅と高さを一度に取得できる便利な関数である。

**業務上の目的・背景**：アイテムのサイズを基準にした動的なレイアウトや、グループ化されたウィジェットのサイズに合わせた他のウィジェットの配置が必要な場面で使用される。例えば、グループの高さに合わせてヒストグラムを表示したり、ボタンのサイズに合わせた装飾を追加したりする際に有用である。

**機能の利用シーン**：
- グループ化されたウィジェットのサイズに合わせて他のウィジェットを配置する場合
- アイテムのサイズを基準にした動的なレイアウト計算
- カスタム描画でアイテムサイズを参照する場合
- デバッグ目的でアイテムのサイズを確認する場合
- 子ウィンドウの実際のサイズを確認する場合

**主要な処理内容**：
1. ImGuiContextから直前のアイテムの矩形情報を取得
2. 矩形のサイズ（Max - Min）を計算して返却

**関連システム・外部連携**：ImGuiの内部状態管理システム（ImGuiContext）のLastItemData.Rectを参照し、GetSize()メソッドで計算する。

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | Demo Window | 参照画面 | Querying Statusセクションでサイズ情報表示 |
| 24 | Layout | 主機能 | グループサイズに合わせたレイアウト |

## 機能種別

情報取得 / クエリ機能

## 入力仕様

### 入力パラメータ

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

### 入力データソース

- ImGuiContext::LastItemData.Rect - 直前に追加されたアイテムの矩形情報

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 戻り値 | ImVec2 | アイテムの幅（x）と高さ（y） |

### 出力先

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

## 処理フロー

### 処理シーケンス

```
1. コンテキスト取得
   └─ ImGuiContextへの参照を取得
2. 矩形情報取得
   └─ g.LastItemData.Rectを参照
3. サイズ計算・返却
   └─ Rect.GetSize()を返却（Max - Min）
```

### フローチャート

```mermaid
flowchart TD
    A[GetItemRectSize呼び出し] --> B[ImGuiContext取得]
    B --> C[g.LastItemData.Rect参照]
    C --> D[Rect.GetSize計算]
    D --> E[ImVec2を返却]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-220-01 | サイズ計算 | サイズはMax - Minで計算される（GetItemRectMax() - GetItemRectMin()と同等） | 常時 |
| BR-220-02 | グループ活用 | BeginGroup/EndGroupと組み合わせて、グループ化されたウィジェット全体のサイズを取得できる | グループ使用時 |

### 計算ロジック

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

ImRect::GetSize()の実装:
```cpp
ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); }
```

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

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

## エラー処理

### エラーケース一覧

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

### リトライ仕様

該当なし

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

該当なし

## パフォーマンス要件

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

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

該当なし

## 備考

- BeginGroup/EndGroupの後にGetItemRectSizeを呼び出すと、グループ全体のサイズを取得できる
- デモコードでは、グループのサイズを取得してPlotHistogramに同じサイズを指定する例が示されている（4684行目）
- 子ウィンドウもアイテムとして扱われるため、EndChild()の後にGetItemRectSizeを呼び出すと子ウィンドウのサイズを取得できる

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui.h | `imgui.h` | ImVec2構造体の定義 |
| 1-2 | imgui.h | `imgui.h` | ImRect構造体のGetSize()メソッド |
| 1-3 | imgui_internal.h | `imgui_internal.h` | ImGuiLastItemData.Rect（1381行目） |

**読解のコツ**: ImRect::GetSize()はMax - Minを計算して返す単純なメソッド。これがGetItemRectSizeの実体となる。

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

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

**主要処理フロー**:
1. **6342行目**: 関数定義
2. **6344行目**: ImGuiContext参照の取得
3. **6345行目**: LastItemData.Rect.GetSize()の返却

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui_demo.cpp | `imgui_demo.cpp` | サイズ情報表示（2163行目） |
| 3-2 | imgui_demo.cpp | `imgui_demo.cpp` | グループサイズに合わせたレイアウト（4684行目） |

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

```
ImGui::GetItemRectSize()
    │
    └─ g.LastItemData.Rect.GetSize() 参照
           └─ ImVec2(Max.x - Min.x, Max.y - Min.y) を返却
```

### データフロー図

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

ウィジェット追加時 ──▶ ItemAdd()でRect設定
                             │
                             ▼
                    g.LastItemData.Rect
                             │
                             ▼
GetItemRectSize() ─────▶ GetSize()計算 ──────▶ ImVec2 (width, height)
                             │
                             ▼
                    Max.x - Min.x, Max.y - Min.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` | デモ | 使用例（2163行目、4684行目） |
