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,
);
}
}