import 'package:flutter/material.dart'; /// 表示の向き調整を行うかどうか(撮影者が見る向き). /// /// スマホを下向きにしてアタッチメントへ載せる運用のため, /// 生プレビューを 180°回転(X 反転=鏡像 + Y 反転=上下反転)して /// 「撮影者が見る向き」に整える. /// /// 向き変換の詳細・座標系は /// [SPEC_04 プレビュー向きとクロップ](../../docs/04_SPEC/SPEC_04_プレビュー向きとクロップ.md) 参照. const bool kDisplayFlip = true; /// [child](向き調整前のコンテンツ)に表示向き変換を適用するウィジェット. /// /// 「生フレーム座標」のコンテンツを,撮影者が見る「表示後座標」へ変換する. /// この変換結果に対して [RegionCrop] が表示後座標 0.0–1.0 でクロップする. /// /// ライブプレビュー([child] = `CameraPreview`)とテスト([child] = 任意の画像)で /// 共通利用できるよう,向き変換のみを担い [child] を差し替え可能にしている. class OrientedPreview extends StatelessWidget { const OrientedPreview({super.key, required this.child}); /// 向き調整前のコンテンツ(生フレーム座標). final Widget child; @override Widget build(BuildContext context) { return Transform( alignment: Alignment.center, // kDisplayFlip: X 反転(鏡像)+ Y 反転(上下)= 180°回転. // 下向き設置で撮影者が見る向きに合わせる.詳細は SPEC_04 参照. transform: kDisplayFlip ? Matrix4.diagonal3Values(-1.0, -1.0, 1.0) : Matrix4.identity(), child: child, ); } }