// (C) 次のフレームの表示時刻にはまだ達していない。
else
{
- _前のフレームを表示する();
+ this.前のフレームを描画する( dr, 変換行列, 不透明度0to1 );
}
#region " ローカル関数 "
this._最後に表示したフレーム = frame;
this._D2DBitmapを描画する( dr, 変換行列, frame.D2DBitmap, 不透明度0to1 );
};
- void _前のフレームを表示する()
- {
- this._D2DBitmapを描画する( dr, 変換行列, this._最後に表示したフレーム?.D2DBitmap, 不透明度0to1 );
- };
//----------------
#endregion
}
}
}
+ public void 前のフレームを描画する( デバイスリソース dr, RectangleF 描画先矩形dpx, float 不透明度0to1 = 1.0f )
+ {
+ // Direct2D の行列は、設計単位じゃなく物理単位で計算するので注意。
+ var 変換行列2Dpx =
+ dr.拡大行列DPXtoPX // スケーリング(1) DPX → PX
+ * Matrix3x2.Scaling( 描画先矩形dpx.Width / this.サイズdpx.Width, 描画先矩形dpx.Height / this.サイズdpx.Height ) // スケーリング(2)
+ * Matrix3x2.Translation( 描画先矩形dpx.Left * dr.拡大率DPXtoPX横方向, 描画先矩形dpx.Top * dr.拡大率DPXtoPX縦方向 ); // 平行移動(物理単位)、
+
+ this.前のフレームを描画する( dr, 変換行列2Dpx, 不透明度0to1 );
+ }
+
+ public void 前のフレームを描画する( デバイスリソース dr, Matrix3x2 変換行列, float 不透明度0to1 = 1.0f )
+ {
+ lock( this._スレッド間同期 )
+ {
+ this._D2DBitmapを描画する( dr, 変換行列, this._最後に表示したフレーム?.D2DBitmap, 不透明度0to1 );
+ }
+ }
+
protected override void On活性化( デバイスリソース dr )
{
this._デコードタスク = null; // タスクが起動していないときは null であることを保証する。
float 拡大縮小率 = 0.75f;
float 上移動dpx = 100.0f;
- this._背景動画?.進行描画する( dr, new RectangleF(
+ // 進行描画せず、直前に取得したフレームをそのまま描画する。
+ this._背景動画?.前のフレームを描画する( dr, new RectangleF(
w * ( 1f - 拡大縮小率 ) / 2f,
h * ( 1f - 拡大縮小率 ) / 2f - 上移動dpx,
w * 拡大縮小率,
}
// ウェイト
- Thread.Sleep( 1 );
+ Thread.Sleep( 4 );
}
this._高頻度進行タスクへのイベント.現在の状態 = TriStateEvent.状態種別.無効;