Newer
Older
SmTIAS-Capture / lib / widgets / oriented_preview.dart
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,
    );
  }
}