---
generated_at: 2026-03-01 12:00:00
metrics:
  claims_total: 146
  claims_with_evidence: 142
  claims_without_evidence: 4
confidence_derived: 0.97
---

# 根拠レポート：renderer-gdi 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された設計書・ドキュメントの信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.97**
  - 根拠あり：142 / 146、根拠なし：4
- 優先レビュー（高）
  1. **C-002（コンストラクタ失敗時の例外スロー）**：CreateCompatibleDC失敗時の挙動はTHROW_HR_IF_NULLマクロに依存しており、モック環境での具体的な例外型が不明
  2. **C-046（非表示ウィンドウでのタイトル変更時描画強制）**：_titleChangedフィールドはRenderEngineBase基底クラスで定義されており、GdiEngineのソース内では直接確認不可
  3. **C-065（ラスタフォントのコードページ変換詳細）**：WideCharToMultiByte/MultiByteToWideCharの具体的な変換結果は実行環境のコードページに依存
  4. **C-071（西洋スクリプト最適化パスの詳細）**：ScriptIsComplexの戻り値とフォント特性の組み合わせ条件はUniscribe API仕様に依存

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。

- E-01: `src/renderer/gdi/gdirenderer.hpp` - GdiEngineクラスのヘッダファイル（クラス定義、メンバ変数、メソッド宣言）
- E-02: `src/renderer/gdi/paint.cpp` - 描画関連メソッドの実装（StartPaint, EndPaint, ScrollFrame, PaintBufferLine, PaintBufferGridLines, PaintCursor, PaintSelection, PaintImageSlice等）
- E-03: `src/renderer/gdi/state.cpp` - 状態管理メソッドの実装（コンストラクタ、デストラクタ、SetHwnd, UpdateDrawingBrushes, UpdateFont, PrepareLineTransform等）
- E-04: `src/renderer/gdi/invalidate.cpp` - 無効化関連メソッドの実装（Invalidate, InvalidateAll, InvalidateScroll, InvalidateSelection, _InvalidCombine, _InvalidOffset, _InvalidRestrict等）
- E-05: `src/renderer/gdi/math.cpp` - 数学/計算関連メソッドの実装（GetDirtyArea, IsGlyphWideByFont, s_ScaleByDpi, s_ShrinkByDpi, _GetRectSize, _OrRect等）
- E-06: `src/renderer/gdi/precomp.h` - プリコンパイルヘッダ（依存関係の定義、WHEN_DBGマクロ定義）

## 3) Claims と根拠の対応（レビューの主戦場）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-001 | コンストラクタで初期状態が正しく設定される | E-03 (state.cpp L21-67) | ○ |
| C-002 | CreateCompatibleDC失敗時に例外がスローされる | E-03 (state.cpp L43-44, THROW_HR_IF_NULL) | △ |
| C-003 | デストラクタでGDIリソースが解放される | E-03 (state.cpp L75-105) | ○ |
| C-004 | SetHwndで有効なウィンドウハンドルを設定できる | E-03 (state.cpp L114-156) | ○ |
| C-005 | SetHwndでGetDCがnull時にE_FAIL | E-03 (state.cpp L117-118) | ○ |
| C-006 | SetHwndで既存メモリコンテキストが解放される | E-03 (state.cpp L130-134) | ○ |
| C-007 | s_SetWindowLongWHelper成功時にS_OK | E-03 (state.cpp L166-180) | ○ |
| C-008 | s_SetWindowLongWHelper失敗時にエラー返却 | E-03 (state.cpp L172-177) | ○ |
| C-009 | ResetLineTransform：既にIDENTITY時にS_FALSE | E-03 (state.cpp L188-191) | ○ |
| C-010 | ResetLineTransform：変換リセット成功 | E-03 (state.cpp L188-200) | ○ |
| C-011 | PrepareLineTransform：SingleWidth | E-03 (state.cpp L210-251) | ○ |
| C-012 | PrepareLineTransform：DoubleWidth | E-03 (state.cpp L223-225) | ○ |
| C-013 | PrepareLineTransform：DoubleHeightTop | E-03 (state.cpp L226-232) | ○ |
| C-014 | PrepareLineTransform：DoubleHeightBottom | E-03 (state.cpp L233-239) | ○ |
| C-015 | PrepareLineTransform：viewportLeftのオフセット計算 | E-03 (state.cpp L216) | ○ |
| C-016 | PrepareLineTransform：同一設定でS_FALSE | E-03 (state.cpp L242) | ○ |
| C-017 | UpdateDrawingBrushes：前景色・背景色設定 | E-03 (state.cpp L264-286) | ○ |
| C-018 | UpdateDrawingBrushes：色変更なし時のスキップ | E-03 (state.cpp L277-286) | ○ |
| C-019 | UpdateDrawingBrushes：デフォルトブラシ設定 | E-03 (state.cpp L288-295) | ○ |
| C-020 | UpdateDrawingBrushes：_hdcMemoryContext=null時のエラー | E-03 (state.cpp L272) | ○ |
| C-021 | UpdateDrawingBrushes：Boldフォント選択 | E-03 (state.cpp L298-321, L325-331) | ○ |
| C-022 | UpdateDrawingBrushes：Italicフォント選択 | E-03 (state.cpp L312-314) | ○ |
| C-023 | UpdateDrawingBrushes：BoldItalicフォント選択 | E-03 (state.cpp L315-318) | ○ |
| C-024 | UpdateDrawingBrushes：ソフトフォント選択 | E-03 (state.cpp L299-301, L334-336) | ○ |
| C-025 | UpdateFont：フォント更新の基本機能 | E-03 (state.cpp L356-499) | ○ |
| C-026 | UpdateFont：TrueTypeフォントメトリクス計算 | E-03 (state.cpp L379-387) | ○ |
| C-027 | UpdateFont：非TrueTypeフォールバック計算 | E-03 (state.cpp L389-395) | ○ |
| C-028 | UpdateSoftFont：ソフトフォント更新 | E-03 (state.cpp L509-526) | ○ |
| C-029 | UpdateSoftFont：Softフォント選択中のリセット | E-03 (state.cpp L516-520) | ○ |
| C-030 | UpdateDpi：DPI更新 | E-03 (state.cpp L534-538) | ○ |
| C-031 | UpdateViewport：常にS_OK | E-03 (state.cpp L547-550) | ○ |
| C-032 | GetProposedFont：基本機能 | E-03 (state.cpp L563-567) | ○ |
| C-033 | _GetProposedFont：デフォルトラスタフォント | E-03 (state.cpp L606-617) | ○ |
| C-034 | _GetProposedFont：4種フォント作成 | E-03 (state.cpp L673-697) | ○ |
| C-035 | _GetProposedFont：ABCメトリクス精密計算 | E-03 (state.cpp L718-730) | ○ |
| C-036 | _GetProposedFont：ABCメトリクス異常値フォールバック | E-03 (state.cpp L725-729) | ○ |
| C-037 | _DoUpdateTitle：PostMessageW成功時S_OK | E-03 (state.cpp L576-580) | ○ |
| C-038 | _DoUpdateTitle：PostMessageW失敗時E_FAIL | E-03 (state.cpp L579) | ○ |
| C-039 | FontHasWesternScript：全グリフ存在時true | E-02 (paint.cpp L15-20) | ○ |
| C-040 | FontHasWesternScript：グリフ欠落時false | E-02 (paint.cpp L18-19) | ○ |
| C-041 | FontHasWesternScript：API失敗時false | E-02 (paint.cpp L18) | ○ |
| C-042 | StartPaint：描画開始成功 | E-02 (paint.cpp L28-68) | ○ |
| C-043 | StartPaint：無効ウィンドウでS_FALSE | E-02 (paint.cpp L31) | ○ |
| C-044 | StartPaint：二重描画開始の防止 | E-02 (paint.cpp L34) | ○ |
| C-045 | StartPaint：非表示ウィンドウでのスキップ | E-02 (paint.cpp L39) | ○ |
| C-046 | StartPaint：タイトル変更時の描画強制 | E-02 (paint.cpp L39, _titleChanged) | △ |
| C-047 | EndPaint：正常終了処理 | E-02 (paint.cpp L220-249) | ○ |
| C-048 | EndPaint：未開始時ERROR_INVALID_STATE | E-02 (paint.cpp L223) | ○ |
| C-049 | Present：常にS_FALSE | E-02 (paint.cpp L258-261) | ○ |
| C-050 | ScrollFrame：スクロール量0のスキップ | E-02 (paint.cpp L81) | ○ |
| C-051 | ScrollFrame：スクロール処理基本機能 | E-02 (paint.cpp L78-146) | ○ |
| C-052 | ScrollFrame：フォントサイズ0のエラー | E-02 (paint.cpp L117) | ○ |
| C-053 | ScrollFrame：カーソル反転クリア | E-02 (paint.cpp L85-112) | ○ |
| C-054 | ScrollFrame：非IDENTITY変換のカーソルクリア | E-02 (paint.cpp L90-109) | ○ |
| C-055 | _PrepareMemoryBitmap：初期作成 | E-02 (paint.cpp L199-206) | ○ |
| C-056 | _PrepareMemoryBitmap：同サイズスキップ | E-02 (paint.cpp L163) | ○ |
| C-057 | _PrepareMemoryBitmap：リサイズ時Blt | E-02 (paint.cpp L169-198) | ○ |
| C-058 | PaintBackground：fErase=TRUE時の背景描画 | E-02 (paint.cpp L289-304) | ○ |
| C-059 | PaintBackground：fErase=FALSE時のスキップ | E-02 (paint.cpp L298-301) | ○ |
| C-060 | PaintBackground：cursorInvertRectsクリア | E-02 (paint.cpp L296) | ○ |
| C-061 | PaintBufferLine：基本テキスト描画 | E-02 (paint.cpp L324-439) | ○ |
| C-062 | PaintBufferLine：空クラスタースキップ | E-02 (paint.cpp L334) | ○ |
| C-063 | PaintBufferLine：trimLeft処理 | E-02 (paint.cpp L424-427) | ○ |
| C-064 | PaintBufferLine：キャッシュフラッシュトリガー | E-02 (paint.cpp L431-434) | ○ |
| C-065 | PaintBufferLine：ラスタフォントコードページ変換 | E-02 (paint.cpp L369-405) | △ |
| C-066 | PaintBufferLine：DoubleHeightTopクリッピング | E-02 (paint.cpp L409-411) | ○ |
| C-067 | PaintBufferLine：DoubleHeightBottomクリッピング | E-02 (paint.cpp L410) | ○ |
| C-068 | PaintBufferLine：ソフトフォント文字マスク | E-02 (paint.cpp L349) | ○ |
| C-069 | _FlushBufferLines：描画実行 | E-02 (paint.cpp L448-505) | ○ |
| C-070 | _FlushBufferLines：空キャッシュスキップ | E-02 (paint.cpp L452) | ○ |
| C-071 | _FlushBufferLines：西洋スクリプト最適化パス | E-02 (paint.cpp L467-473) | △ |
| C-072 | _FlushBufferLines：複雑スクリプトパス | E-02 (paint.cpp L475-493) | ○ |
| C-073 | PaintBufferGridLines：Left線描画 | E-02 (paint.cpp L581-588) | ○ |
| C-074 | PaintBufferGridLines：Right線描画 | E-02 (paint.cpp L590-599) | ○ |
| C-075 | PaintBufferGridLines：Top線描画 | E-02 (paint.cpp L601-605) | ○ |
| C-076 | PaintBufferGridLines：Bottom線描画 | E-02 (paint.cpp L607-613) | ○ |
| C-077 | PaintBufferGridLines：Strikethrough線描画 | E-02 (paint.cpp L615-619) | ○ |
| C-078 | PaintBufferGridLines：Underline描画 | E-02 (paint.cpp L644-647) | ○ |
| C-079 | PaintBufferGridLines：DoubleUnderline描画 | E-02 (paint.cpp L648-652) | ○ |
| C-080 | PaintBufferGridLines：CurlyUnderline描画 | E-02 (paint.cpp L653-656) | ○ |
| C-081 | PaintBufferGridLines：DottedUnderline描画 | E-02 (paint.cpp L622-625, L657-660) | ○ |
| C-082 | PaintBufferGridLines：DashedUnderline描画 | E-02 (paint.cpp L626-629, L661-664) | ○ |
| C-083 | PaintImageSlice：不透明画像SRCCOPY | E-02 (paint.cpp L714-717) | ○ |
| C-084 | PaintImageSlice：半透明画像マスク描画 | E-02 (paint.cpp L718-722) | ○ |
| C-085 | PaintImageSlice：透明画像スキップ | E-02 (paint.cpp L704-722) | ○ |
| C-086 | PaintImageSlice：_imageMaskリサイズ | E-02 (paint.cpp L679-682) | ○ |
| C-087 | PaintCursor：isOn=false時S_FALSE | E-02 (paint.cpp L737-740) | ○ |
| C-088 | PaintCursor：Legacy型カーソル描画 | E-02 (paint.cpp L766-781) | ○ |
| C-089 | PaintCursor：Legacy型最小値クランプ | E-02 (paint.cpp L771) | ○ |
| C-090 | PaintCursor：Legacy型最大値クランプ | E-02 (paint.cpp L772) | ○ |
| C-091 | PaintCursor：VerticalBar型描画 | E-02 (paint.cpp L783-791) | ○ |
| C-092 | PaintCursor：Underscore型描画 | E-02 (paint.cpp L793-796) | ○ |
| C-093 | PaintCursor：DoubleUnderscore型描画 | E-02 (paint.cpp L798-809) | ○ |
| C-094 | PaintCursor：EmptyBox型描画 | E-02 (paint.cpp L811-829) | ○ |
| C-095 | PaintCursor：FullBox型描画 | E-02 (paint.cpp L832-834) | ○ |
| C-096 | PaintCursor：未知カーソル型E_NOTIMPL | E-02 (paint.cpp L836-837) | ○ |
| C-097 | PaintCursor：二倍幅カーソル | E-02 (paint.cpp L754-757) | ○ |
| C-098 | PaintCursor：フォントサイズ0のエラー | E-02 (paint.cpp L744) | ○ |
| C-099 | PaintCursor：fUseColor=true時のFillRect | E-02 (paint.cpp L847-857) | ○ |
| C-100 | PaintCursor：fUseColor=false時のPatBlt | E-02 (paint.cpp L858-872) | ○ |
| C-101 | PaintSelection：選択領域反転描画 | E-02 (paint.cpp L885-894) | ○ |
| C-102 | PaintSelection：InvertRect失敗時E_FAIL | E-02 (paint.cpp L891) | ○ |
| C-103 | _PaintBackgroundColor：FillRect呼出 | E-02 (paint.cpp L269-281) | ○ |
| C-104 | _PaintBackgroundColor：ブラシ取得失敗 | E-02 (paint.cpp L271-272) | ○ |
| C-105 | InvalidateSystem：基本機能 | E-04 (invalidate.cpp L21-24) | ○ |
| C-106 | InvalidateScroll：スクロール無効化 | E-04 (invalidate.cpp L32-42) | ○ |
| C-107 | InvalidateScroll：デルタ0スキップ | E-04 (invalidate.cpp L34) | ○ |
| C-108 | InvalidateSelection：複数矩形無効化 | E-04 (invalidate.cpp L50-57) | ○ |
| C-109 | InvalidateSelection：空span処理 | E-04 (invalidate.cpp L52-56) | ○ |
| C-110 | Invalidate：文字-ピクセル座標変換 | E-04 (invalidate.cpp L66-70) | ○ |
| C-111 | InvalidateCursor：Invalidateへの委譲 | E-04 (invalidate.cpp L78-81) | ○ |
| C-112 | InvalidateAll：全体無効化 | E-04 (invalidate.cpp L90-101) | ○ |
| C-113 | InvalidateAll：無効ウィンドウでS_FALSE | E-04 (invalidate.cpp L93-96) | ○ |
| C-114 | _InvalidCombine：初回設定 | E-04 (invalidate.cpp L109-125) | ○ |
| C-115 | _InvalidCombine：OR結合 | E-04 (invalidate.cpp L117-119) | ○ |
| C-116 | _InvalidOffset：オフセット+結合 | E-04 (invalidate.cpp L133-152) | ○ |
| C-117 | _InvalidOffset：未使用時スキップ | E-04 (invalidate.cpp L135) | ○ |
| C-118 | _InvalidRestrict：境界クランプ | E-04 (invalidate.cpp L160-174) | ○ |
| C-119 | _InvalidateRect：_InvalidCombineへの委譲 | E-04 (invalidate.cpp L182-185) | ○ |
| C-120 | GetDirtyArea：ダーティ領域取得 | E-05 (math.cpp L19-26) | ○ |
| C-121 | IsGlyphWideByFont：TrueType半角判定 | E-05 (math.cpp L36-71) | ○ |
| C-122 | IsGlyphWideByFont：TrueType全角判定 | E-05 (math.cpp L46-51) | ○ |
| C-123 | IsGlyphWideByFont：ラスタフォント判定 | E-05 (math.cpp L54-59) | ○ |
| C-124 | IsGlyphWideByFont：サロゲートペア判定 | E-05 (math.cpp L62-66) | ○ |
| C-125 | s_ScaleByDpi：等倍 | E-05 (math.cpp L80-83) | ○ |
| C-126 | s_ScaleByDpi：1.5倍 | E-05 (math.cpp L80-83) | ○ |
| C-127 | s_ScaleByDpi：ゼロ値 | E-05 (math.cpp L82) | ○ |
| C-128 | s_ShrinkByDpi：縮小 | E-05 (math.cpp L92-95) | ○ |
| C-129 | s_ShrinkByDpi：等倍 | E-05 (math.cpp L92-95) | ○ |
| C-130 | _GetInvalidRectPoint：座標取得 | E-05 (math.cpp L103-110) | ○ |
| C-131 | _GetInvalidRectSize：サイズ計算 | E-05 (math.cpp L118-121) | ○ |
| C-132 | _GetRectSize：RECTからサイズ計算 | E-05 (math.cpp L129-136) | ○ |
| C-133 | _GetRectSize：空RECT | E-05 (math.cpp L131-132) | ○ |
| C-134 | _OrRect：OR結合 | E-05 (math.cpp L146-152) | ○ |
| C-135 | _OrRect：包含関係OR結合 | E-05 (math.cpp L148-151) | ○ |
| C-136 | GetFontSize：フォントサイズ取得 | E-03 (state.cpp L770-774) | ○ |
| C-137 | _GetFontSize：内部フォントサイズ取得 | E-03 (state.cpp L782-785) | ○ |
| C-138 | _IsMinimized：最小化時true | E-03 (state.cpp L793-796) | ○ |
| C-139 | _IsMinimized：非最小化時false | E-03 (state.cpp L793-796) | ○ |
| C-140 | _IsFontTrueType：TrueType時true | E-03 (state.cpp L805-808) | ○ |
| C-141 | _IsFontTrueType：ラスタ時false | E-03 (state.cpp L805-808) | ○ |
| C-142 | _IsWindowValid：有効ハンドルtrue | E-03 (state.cpp L816-820) | ○ |
| C-143 | _IsWindowValid：INVALID_HANDLE_VALUE時false | E-03 (state.cpp L818) | ○ |
| C-144 | _IsWindowValid：nullptr時false | E-03 (state.cpp L819) | ○ |
| C-145 | operator==(XFORM)：一致時true | E-01 (gdirenderer.hpp L230-233) | ○ |
| C-146 | operator==(XFORM)：不一致時false | E-01 (gdirenderer.hpp L230-233) | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-002**: コンストラクタ失敗時の例外型はWILライブラリ（THROW_HR_IF_NULLマクロ）の実装に依存しており、GdiEngineソースコードだけでは具体的な例外型を特定できない
  - 候補：WILのドキュメント / `wil/result_macros.h` の実装確認
- **C-046**: `_titleChanged`メンバは`RenderEngineBase`基底クラスで定義されており、GdiEngineモジュール外のソースコード参照が必要
  - 候補：`src/renderer/inc/RenderEngineBase.hpp` / 基底クラスの実装
- **C-065**: ラスタフォントのコードページ変換の具体的な結果は、実行環境のシステムコードページ設定に依存する
  - 候補：Win32 API仕様書 / テスト環境のコードページ設定
- **C-071**: `ScriptIsComplex`と`_fontHasWesternScript`の組み合わせ条件の詳細はUniscribe API仕様に依存
  - 候補：Microsoft Uniscribe APIドキュメント / Windows SDK

## 5) リスクフラグ（レビュー観点）
- **0（低リスク）**: 全体の97%のテストケースに明確なソースコード根拠あり。テスト観点は正常系・異常系・境界値を網羅
- **1（中リスク）**: GDI API（ExtTextOutW, StretchDIBits, InvertRect等）のモック化が必要なテストケースが多数存在し、テスト環境構築のコストが高い
- **1（中リスク）**: 基底クラス`RenderEngineBase`のメンバやvirtualメソッドに依存する部分のテストカバレッジが基底クラスの実装に左右される
- **0（低リスク）**: 数値計算系メソッド（s_ScaleByDpi, s_ShrinkByDpi, _OrRect, _GetRectSize）は純粋関数でありテストが容易

## 6) レビュアーチェックリスト（最小）
- [ ] GDI APIモック化戦略が実現可能か確認（Win32 APIの多くがC関数であり、直接モックが困難な場合がある）
- [ ] `RenderEngineBase`基底クラスの`_titleChanged`フィールドの動作がStartPaintテスト（C-046）と整合するか確認
- [ ] カーソル描画テスト（C-087〜C-100）のカーソル型網羅性が最新のCursorType enumと一致するか確認
- [ ] UpdateFont内のラインメトリクス計算（C-025〜C-027）の期待値が実際のフォントメトリクスと整合するか確認
- [ ] PaintBufferLine内のラスタフォントコードページ変換テスト（C-065）の入力値が具体的に定義可能か確認
