\r
public class CAVI : IDisposable\r
{\r
- public CAvi avi;\r
+ public CAviDS avi;\r
private bool bDispose済み;\r
public int n番号;\r
public string strコメント文 = "";\r
\r
try\r
{\r
- this.avi = new CAvi( strAVIファイル名 );\r
- Trace.TraceInformation( "CAVI: 動画を生成しました。({0})({1})({2}frames)", this.strコメント文, Path.GetFileName( strAVIファイル名 ), this.avi.GetMaxFrameCount() );\r
+ this.avi = new CAviDS( strAVIファイル名 );\r
+ Trace.TraceInformation( "CAviDS: 動画を生成しました。({0})({1})({2}msec)", this.strコメント文, Path.GetFileName( strAVIファイル名 ), this.avi.GetDuration() );\r
}\r
catch ( Exception e )\r
{\r
Trace.TraceError( e.Message );\r
- Trace.TraceError( "CAVI: 動画の生成に失敗しました。({0})({1})", this.strコメント文, Path.GetFileName( strAVIファイル名 ) );\r
+ Trace.TraceError( "CAviDS: 動画の生成に失敗しました。({0})({1})", this.strコメント文, Path.GetFileName( strAVIファイル名 ) );\r
this.avi = null;\r
}\r
}\r
{\r
if ( this.rAVI != null && this.rAVI.avi != null )\r
{\r
- int dwRate = (int) this.rAVI.avi.dwレート;\r
- int dwScale = (int) this.rAVI.avi.dwスケール;\r
- nDuration = (int) ( 1000.0f * dwScale / dwRate * this.rAVI.avi.GetMaxFrameCount() );\r
+ // int dwRate = (int) this.rAVI.avi.dwレート;\r
+ // int dwScale = (int) this.rAVI.avi.dwスケール;\r
+ // (int) ( 1000.0f * dwScale / dwRate * this.rAVI.avi.GetMaxFrameCount() );\r
+ nDuration = this.rAVI.avi.GetDuration();\r
}\r
}\r
\r
\r
if ( this.rAVI != null )\r
{\r
- this.actAVI.t進行描画( x, y );\r
+ this.actAVI.t進行描画( x, y, 612, 605 );\r
return;\r
}\r
\r
set;\r
}\r
\r
+ private void CreateTexture(int width, int height)\r
+ {\r
+ try\r
+ {\r
+ if (this.tx描画用 != null)\r
+ {\r
+ this.tx描画用.Dispose();\r
+ this.tx描画用 = null;\r
+ }\r
+ this.tx描画用 = new CTexture(\r
+ CDTXMania.app.Device, width, height,\r
+ CDTXMania.app.GraphicsDeviceManager.CurrentSettings.BackBufferFormat,\r
+ Pool.Managed);\r
+ }\r
+ catch (CTextureCreateFailedException e)\r
+ {\r
+ Trace.TraceError("CActAVI: OnManagedリソースの作成(): " + e.Message);\r
+ this.tx描画用 = null;\r
+ }\r
+ }\r
\r
// メソッド\r
-\r
- public void Start( int nチャンネル番号, CDTX.CAVI rAVI, int n開始サイズW, int n開始サイズH, int n終了サイズW, int n終了サイズH, int n画像側開始位置X, int n画像側開始位置Y, int n画像側終了位置X, int n画像側終了位置Y, int n表示側開始位置X, int n表示側開始位置Y, int n表示側終了位置X, int n表示側終了位置Y, int n総移動時間ms, int n移動開始時刻ms )\r
+ public void Start(int nチャンネル番号, CDTX.CAVI rAVI, int n開始サイズW, int n開始サイズH, int n終了サイズW, int n終了サイズH, int n画像側開始位置X, int n画像側開始位置Y, int n画像側終了位置X, int n画像側終了位置Y, int n表示側開始位置X, int n表示側開始位置Y, int n表示側終了位置X, int n表示側終了位置Y, int n総移動時間ms, int n移動開始時刻ms)\r
{\r
if( nチャンネル番号 == (int) Ech定義.Movie || nチャンネル番号 == (int) Ech定義.MovieFull )\r
{\r
this.n表示側終了位置Y = n表示側終了位置Y;\r
this.n総移動時間ms = n総移動時間ms;\r
this.n移動開始時刻ms = ( n移動開始時刻ms != -1 ) ? n移動開始時刻ms : CSound管理.rc演奏用タイマ.n現在時刻;\r
- this.n前回表示したフレーム番号 = -1;\r
+ this.CreateTexture((int)this.rAVI.avi.nフレーム幅, (int)this.rAVI.avi.nフレーム高さ);\r
+ // this.n前回表示したフレーム番号 = -1;\r
}\r
}\r
public void SkipStart( int n移動開始時刻ms )\r
this.n移動開始時刻ms = n再開時刻ms;\r
}\r
}\r
- public unsafe int t進行描画( int x, int y )\r
+ public unsafe int t進行描画(int x, int y, int areaDrawingWidth, int areaDrawingHeight)\r
{\r
if( !base.b活性化してない )\r
{\r
- Rectangle rectangle;\r
- Rectangle rectangle2;\r
+ // Rectangle rectangle;\r
+ // Rectangle rectangle2;\r
if ( ( ( this.n移動開始時刻ms == -1 ) || ( this.rAVI == null ) ) || ( this.rAVI.avi == null ) )\r
{\r
return 0;\r
{\r
return 0;\r
}\r
- int time = (int) ( ( CSound管理.rc演奏用タイマ.n現在時刻 - this.n移動開始時刻ms ) * ( ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0 ) );\r
- int frameNoFromTime = this.rAVI.avi.GetFrameNoFromTime( time );\r
+ int time = (int)((CSound管理.rc演奏用タイマ.n現在時刻 - this.n移動開始時刻ms) * (((double)CDTXMania.ConfigIni.n演奏速度) / 20.0));\r
+ // int frameNoFromTime = this.rAVI.avi.GetFrameNoFromTime( time );\r
if( ( this.n総移動時間ms != 0 ) && ( this.n総移動時間ms < time ) )\r
{\r
this.n総移動時間ms = 0;\r
this.n移動開始時刻ms = -1;\r
return 0;\r
}\r
- if( ( this.n総移動時間ms == 0 ) && ( frameNoFromTime >= this.rAVI.avi.GetMaxFrameCount() ) )\r
+ if( ( this.n総移動時間ms == 0 ) && time >= this.rAVI.avi.GetDuration() ) // ( frameNoFromTime >= this.rAVI.avi.GetMaxFrameCount() ) )\r
{\r
if ( !bIsPreviewMovie )\r
{\r
// PREVIEW時はループ再生する。移動開始時刻msを現時刻にして(=AVIを最初に巻き戻して)、ここまでに行った計算をやり直す。\r
this.n移動開始時刻ms = CSound管理.rc演奏用タイマ.n現在時刻;\r
time = (int) ( ( CSound管理.rc演奏用タイマ.n現在時刻 - this.n移動開始時刻ms ) * ( ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0 ) );\r
- frameNoFromTime = this.rAVI.avi.GetFrameNoFromTime( time );\r
+ // frameNoFromTime = this.rAVI.avi.GetFrameNoFromTime( time );\r
}\r
+ /*\r
if( ( this.n前回表示したフレーム番号 != frameNoFromTime ) && !this.bフレームを作成した )\r
{\r
- this.pBmp = this.rAVI.avi.GetFramePtr( frameNoFromTime );\r
+ // this.pBmp = this.rAVI.avi.GetFramePtr( frameNoFromTime );\r
this.n前回表示したフレーム番号 = frameNoFromTime;\r
this.bフレームを作成した = true;\r
}\r
return 0;\r
}\r
}\r
- if( ( this.tx描画用 != null ) && ( this.n総移動時間ms != -1 ) )\r
+ */\r
+ if ((this.tx描画用 != null) && (this.n総移動時間ms != -1))\r
{\r
- if( this.bフレームを作成した && ( this.pBmp != IntPtr.Zero ) )\r
+ this.rAVI.avi.tGetBitmap(CDTXMania.app.Device, this.tx描画用, time);\r
+ /*\r
+ if (this.bフレームを作成した && (this.pBmp != IntPtr.Zero))\r
{\r
DataRectangle rectangle3 = this.tx描画用.texture.LockRectangle( 0, LockFlags.None );\r
DataStream data = rectangle3.Data;\r
this.tx描画用.texture.UnlockRectangle( 0 );\r
this.bフレームを作成した = false;\r
}\r
-\r
+ */\r
// 旧動画 (278x355以下)の場合と、それ以上の場合とで、拡大/表示位置補正ロジックを変えること。\r
// 旧動画の場合は、「278x355の領域に表示される」ことを踏まえて扱う必要あり。\r
// 例: 上半分だけ動画表示するような場合は・・・「上半分だけ」という表示意図を維持すべきか?それとも無視して全画面拡大すべきか??\r
+ // chnmr0 (2015/10/31) : フルスクリーンかどうかにかかわらず、表示領域いっぱいにアス比保持で拡縮します。\r
\r
- float magX, magY;\r
- int xx, yy;\r
- if ( ! bFullScreenMovie )\r
- //if ( bHasBGA || bIsPreviewMovie )\r
+ float magX = 1, magY = 1;\r
+ int xx = x, yy = y;\r
+ if (bFullScreenMovie)\r
{\r
- #region [ BGA領域での再生 ]\r
- xx = x;\r
- yy = y;\r
- magX = Scale.X;\r
- magY = Scale.Y;\r
- #endregion\r
+ areaDrawingHeight = SampleFramework.GameWindowSize.Height;\r
+ areaDrawingWidth = SampleFramework.GameWindowSize.Width;\r
+ xx = 0;\r
+ yy = 0;\r
+ }\r
+ #region [ アスペクト比を維持した拡大縮小 ]\r
+ magX = (float)areaDrawingWidth / this.rAVI.avi.nフレーム幅;\r
+ magY = (float)areaDrawingHeight / this.rAVI.avi.nフレーム高さ;\r
+ if (magX > magY)\r
+ {\r
+ magX = magY;\r
+ xx += (int)((areaDrawingWidth - (this.rAVI.avi.nフレーム幅 * magY)) / 2);\r
}\r
else\r
{\r
- #region [ 全画面背景再生。アスペクト比を維持した拡大縮小 ]\r
- xx = 0;\r
- yy = 0;\r
- magX = (float) SampleFramework.GameWindowSize.Width / this.rAVI.avi.nフレーム幅;\r
- magY = (float) SampleFramework.GameWindowSize.Height / this.rAVI.avi.nフレーム高さ;\r
- if ( magX > magY )\r
- {\r
- magX = magY;\r
- xx = (int) ( ( SampleFramework.GameWindowSize.Width - ( this.rAVI.avi.nフレーム幅 * magY ) ) / 2 );\r
- }\r
- else\r
- {\r
- magY = magX;\r
- yy = (int) ( ( SampleFramework.GameWindowSize.Height - ( this.rAVI.avi.nフレーム高さ * magX ) ) / 2 );\r
- }\r
- #endregion\r
+ magY = magX;\r
+ yy += (int)((areaDrawingHeight - (this.rAVI.avi.nフレーム高さ * magX)) / 2);\r
}\r
+ #endregion\r
\r
- \r
this.tx描画用.vc拡大縮小倍率.X = magX;\r
this.tx描画用.vc拡大縮小倍率.Y = magY;\r
this.tx描画用.vc拡大縮小倍率.Z = 1.0f;\r
{\r
this.rAVI = null;\r
this.n移動開始時刻ms = -1;\r
- this.n前回表示したフレーム番号 = -1;\r
- this.bフレームを作成した = false;\r
- this.pBmp = IntPtr.Zero;\r
+ // this.n前回表示したフレーム番号 = -1;\r
+ // this.bフレームを作成した = false;\r
+ // this.pBmp = IntPtr.Zero;\r
// this.bIsPreviewMovie = false; // bIsPreviewMovieは、活性化前にtrueにすること (OnManagedリソースの作成 で参照しているため)\r
this.bHasBGA = false;\r
this.bFullScreenMovie = false;\r
355,\r
CDTXMania.app.GraphicsDeviceManager.CurrentSettings.BackBufferFormat, Pool.Default, Usage.Dynamic );\r
#else\r
- try\r
- {\r
- this.tx描画用 = new CTexture( CDTXMania.app.Device,\r
- //(bIsPreviewMovie)? 204 : 278,\r
- //(bIsPreviewMovie)? 269 : 355,\r
- ( bIsPreviewMovie ) ? 204 : SampleFramework.GameWindowSize.Width,\r
- ( bIsPreviewMovie ) ? 269 : SampleFramework.GameWindowSize.Height,\r
- CDTXMania.app.GraphicsDeviceManager.CurrentSettings.BackBufferFormat, Pool.Managed );\r
- }\r
- catch ( CTextureCreateFailedException e )\r
- {\r
- Trace.TraceError( "CActAVI: OnManagedリソースの作成(): " + e.Message );\r
- this.tx描画用 = null;\r
- }\r
+ this.CreateTexture(\r
+ (bIsPreviewMovie) ? 204 : SampleFramework.GameWindowSize.Width,\r
+ (bIsPreviewMovie) ? 269 : SampleFramework.GameWindowSize.Height\r
+ );\r
#endif\r
this.tx描画用.vc拡大縮小倍率 = new Vector3( Scale.X, Scale.Y, 1f );\r
//this.tx描画用.vc拡大縮小倍率 = new Vector3( 2f, 2f, 1f );\r
\r
#region [ private ]\r
//-----------------\r
- private bool bフレームを作成した;\r
+ // private bool bフレームを作成した;\r
private long n移動開始時刻ms;\r
private int n画像側開始位置X;\r
private int n画像側開始位置Y;\r
private int n開始サイズW;\r
private int n終了サイズH;\r
private int n終了サイズW;\r
- private int n前回表示したフレーム番号;\r
+ // private int n前回表示したフレーム番号;\r
private int n総移動時間ms;\r
private int n表示側開始位置X;\r
private int n表示側開始位置Y;\r
private int n表示側終了位置X;\r
private int n表示側終了位置Y;\r
- private IntPtr pBmp;\r
+ //private IntPtr pBmp;\r
private CDTX.CAVI rAVI;\r
private CTexture tx描画用;\r
//-----------------\r
{\r
if( ( ( this.stLayer[ i ].n移動開始時刻ms != -1 ) && ( ( this.stLayer[ i ].rBMP != null ) || ( this.stLayer[ i ].rBMPTEX != null ) ) ) && ( ( ( this.stLayer[ i ].rBMP == null ) || ( this.stLayer[ i ].rBMP.bUse && ( this.stLayer[ i ].rBMP.tx画像 != null ) ) ) && ( ( this.stLayer[ i ].rBMPTEX == null ) || ( this.stLayer[ i ].rBMPTEX.bUse && ( this.stLayer[ i ].rBMPTEX.tx画像 != null ) ) ) ) )\r
{\r
- Size size = this.stLayer[ i ].sz開始サイズ;\r
- Size size2 = this.stLayer[ i ].sz終了サイズ;\r
- Point point = this.stLayer[ i ].pt画像側開始位置;\r
- Point point2 = this.stLayer[ i ].pt画像側終了位置;\r
- Point point3 = this.stLayer[ i ].pt表示側開始位置;\r
- Point point4 = this.stLayer[ i ].pt表示側終了位置;\r
- long num2 = this.stLayer[ i ].n総移動時間ms;\r
- long num3 = this.stLayer[ i ].n移動開始時刻ms;\r
- if( CDTXMania.Timer.n現在時刻 < num3 )\r
+ Size sizeStart = this.stLayer[ i ].sz開始サイズ;\r
+ Size sizeEnd = this.stLayer[ i ].sz終了サイズ;\r
+ Point ptImgStart = this.stLayer[ i ].pt画像側開始位置;\r
+ Point ptImgEnd = this.stLayer[ i ].pt画像側終了位置;\r
+ Point ptDispStart = this.stLayer[ i ].pt表示側開始位置;\r
+ Point ptDispEnd = this.stLayer[ i ].pt表示側終了位置;\r
+ long timeTotal = this.stLayer[ i ].n総移動時間ms;\r
+ long timeMoveStart = this.stLayer[ i ].n移動開始時刻ms;\r
+ if( CDTXMania.Timer.n現在時刻 < timeMoveStart )\r
{\r
- num3 = CDTXMania.Timer.n現在時刻;\r
+ timeMoveStart = CDTXMania.Timer.n現在時刻;\r
}\r
- Size size3 = new Size( 0x116, 0x163 );\r
+ // Size size3 = new Size( 0x116, 0x163 );\r
+ Size size3 = new Size(556, 710);\r
+ // #34192 2015/10/30 (chnrm0)\r
+ // 表示域を2倍に変更した。\r
+ // x,yについては次のように変更した。\r
+ // 338,57 => 1014+139,128 (Dr.) 139は278の半分で、GR領域の中央によせるためにすこし右側にずらした。\r
+ // 181,50 => 682, 112 (Gt.)\r
Size size4 = new Size( ( this.stLayer[ i ].rBMP != null ) ? this.stLayer[ i ].rBMP.n幅 : this.stLayer[ i ].rBMPTEX.tx画像.sz画像サイズ.Width, ( this.stLayer[ i ].rBMP != null ) ? this.stLayer[ i ].rBMP.n高さ : this.stLayer[ i ].rBMPTEX.tx画像.sz画像サイズ.Height );\r
- int num4 = (int) ( ( CDTXMania.Timer.n現在時刻 - num3 ) * ( ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0 ) );\r
- if( ( num2 != 0 ) && ( num2 < num4 ) )\r
+ int num4 = (int) ( ( CDTXMania.Timer.n現在時刻 - timeMoveStart ) * ( ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0 ) );\r
+ if( ( timeTotal != 0 ) && ( timeTotal < num4 ) )\r
{\r
- this.stLayer[ i ].pt画像側開始位置 = point = point2;\r
- this.stLayer[ i ].pt表示側開始位置 = point3 = point4;\r
- this.stLayer[ i ].sz開始サイズ = size = size2;\r
- this.stLayer[ i ].n総移動時間ms = num2 = 0;\r
+ this.stLayer[ i ].pt画像側開始位置 = ptImgStart = ptImgEnd;\r
+ this.stLayer[ i ].pt表示側開始位置 = ptDispStart = ptDispEnd;\r
+ this.stLayer[ i ].sz開始サイズ = sizeStart = sizeEnd;\r
+ this.stLayer[ i ].n総移動時間ms = timeTotal = 0;\r
}\r
Rectangle rectangle = new Rectangle();\r
Rectangle rectangle2 = new Rectangle();\r
- if( num2 == 0 )\r
+ if( timeTotal == 0 )\r
{\r
- rectangle.X = point.X;\r
- rectangle.Y = point.Y;\r
- rectangle.Width = size.Width;\r
- rectangle.Height = size.Height;\r
- rectangle2.X = point3.X;\r
- rectangle2.Y = point3.Y;\r
- rectangle2.Width = size.Width;\r
- rectangle2.Height = size.Height;\r
+ rectangle.X = ptImgStart.X;\r
+ rectangle.Y = ptImgStart.Y;\r
+ rectangle.Width = sizeStart.Width;\r
+ rectangle.Height = sizeStart.Height;\r
+ rectangle2.X = ptDispStart.X;\r
+ rectangle2.Y = ptDispStart.Y;\r
+ rectangle2.Width = sizeStart.Width;\r
+ rectangle2.Height = sizeStart.Height;\r
}\r
else\r
{\r
- double num5 = ( (double) num4 ) / ( (double) num2 );\r
- Size size5 = new Size( size.Width + ( (int) ( ( size2.Width - size.Width ) * num5 ) ), size.Height + ( (int) ( ( size2.Height - size.Height ) * num5 ) ) );\r
- rectangle.X = point.X + ( (int) ( ( point2.X - point.X ) * num5 ) );\r
- rectangle.Y = point.Y + ( (int) ( ( point2.Y - point.Y ) * num5 ) );\r
- rectangle.Width = size5.Width;\r
- rectangle.Height = size5.Height;\r
- rectangle2.X = point3.X + ( (int) ( ( point4.X - point3.X ) * num5 ) );\r
- rectangle2.Y = point3.Y + ( (int) ( ( point4.Y - point3.Y ) * num5 ) );\r
- rectangle2.Width = size5.Width;\r
- rectangle2.Height = size5.Height;\r
+ double coefSizeWhileMoving = ( (double) num4 ) / ( (double) timeTotal );\r
+ Size sizeWhileMoving = new Size( sizeStart.Width + ( (int) ( ( sizeEnd.Width - sizeStart.Width ) * coefSizeWhileMoving ) ), sizeStart.Height + ( (int) ( ( sizeEnd.Height - sizeStart.Height ) * coefSizeWhileMoving ) ) );\r
+ rectangle.X = ptImgStart.X + ( (int) ( ( ptImgEnd.X - ptImgStart.X ) * coefSizeWhileMoving ) );\r
+ rectangle.Y = ptImgStart.Y + ( (int) ( ( ptImgEnd.Y - ptImgStart.Y ) * coefSizeWhileMoving ) );\r
+ rectangle.Width = sizeWhileMoving.Width;\r
+ rectangle.Height = sizeWhileMoving.Height;\r
+ rectangle2.X = ptDispStart.X + ( (int) ( ( ptDispEnd.X - ptDispStart.X ) * coefSizeWhileMoving ) );\r
+ rectangle2.Y = ptDispStart.Y + ( (int) ( ( ptDispEnd.Y - ptDispStart.Y ) * coefSizeWhileMoving ) );\r
+ rectangle2.Width = sizeWhileMoving.Width;\r
+ rectangle2.Height = sizeWhileMoving.Height;\r
}\r
if( ( ( ( rectangle.Right > 0 ) && ( rectangle.Bottom > 0 ) ) && ( ( rectangle.Left < size4.Width ) && ( rectangle.Top < size4.Height ) ) ) && ( ( ( rectangle2.Right > 0 ) && ( rectangle2.Bottom > 0 ) ) && ( ( rectangle2.Left < size3.Width ) && ( rectangle2.Top < size3.Height ) ) ) )\r
{\r
}\r
if( ( ( ( ( rectangle.Left < rectangle.Right ) && ( rectangle.Top < rectangle.Bottom ) ) && ( ( rectangle2.Left < rectangle2.Right ) && ( rectangle2.Top < rectangle2.Bottom ) ) ) && ( ( ( rectangle.Right >= 0 ) && ( rectangle.Bottom >= 0 ) ) && ( ( rectangle.Left <= size4.Width ) && ( rectangle.Top <= size4.Height ) ) ) ) && ( ( ( rectangle2.Right >= 0 ) && ( rectangle2.Bottom >= 0 ) ) && ( ( rectangle2.Left <= size3.Width ) && ( rectangle2.Top <= size3.Height ) ) ) )\r
{\r
- if( ( this.stLayer[ i ].rBMP != null ) && ( this.stLayer[ i ].rBMP.tx画像 != null ) )\r
+ bool b2倍可能 = false;\r
+ if( ( rectangle2.Left * 2 <= size3.Width ) && (rectangle2.Top * 2 <= size3.Height ) )\r
{\r
- this.stLayer[ i ].rBMP.tx画像.vc拡大縮小倍率 = new Vector3( Scale.X, Scale.Y, 1f );\r
- //this.stLayer[ i ].rBMP.tx画像.vc拡大縮小倍率 = new Vector3( 2f, 2f, 1f );\r
+ b2倍可能 = true;\r
+ }\r
+ if ( ( this.stLayer[ i ].rBMP != null ) && ( this.stLayer[ i ].rBMP.tx画像 != null ) )\r
+ {\r
+ //this.stLayer[ i ].rBMP.tx画像.vc拡大縮小倍率 = new Vector3( Scale.X, Scale.Y, 1f );\r
+ if (b2倍可能)\r
+ {\r
+ this.stLayer[i].rBMP.tx画像.vc拡大縮小倍率 = new Vector3(2f, 2f, 1f);\r
+ rectangle2.X *= 2;\r
+ rectangle2.Y *= 2;\r
+ }\r
this.stLayer[ i ].rBMP.tx画像.t2D描画(\r
CDTXMania.app.Device,\r
- (x + rectangle2.X) * Scale.X,\r
- (y + rectangle2.Y) * Scale.Y,\r
+ (x + rectangle2.X),\r
+ (y + rectangle2.Y),\r
rectangle );\r
}\r
else if( ( this.stLayer[ i ].rBMPTEX != null ) && ( this.stLayer[ i ].rBMPTEX.tx画像 != null ) )\r
{\r
- this.stLayer[ i ].rBMPTEX.tx画像.vc拡大縮小倍率 = new Vector3( Scale.X, Scale.Y, 1f );\r
- //this.stLayer[ i ].rBMPTEX.tx画像.vc拡大縮小倍率 = new Vector3( 2f, 2f, 1f );\r
+ //this.stLayer[ i ].rBMPTEX.tx画像.vc拡大縮小倍率 = new Vector3( Scale.X, Scale.Y, 1f );\r
+ if (b2倍可能)\r
+ {\r
+ this.stLayer[i].rBMPTEX.tx画像.vc拡大縮小倍率 = new Vector3(2f, 2f, 1f);\r
+ rectangle2.X *= 2;\r
+ rectangle2.Y *= 2;\r
+ }\r
this.stLayer[ i ].rBMPTEX.tx画像.t2D描画(\r
CDTXMania.app.Device,\r
- (x + rectangle2.X) * Scale.X,\r
- (y + rectangle2.Y) * Scale.Y,\r
+ (x + rectangle2.X),\r
+ (y + rectangle2.Y),\r
rectangle );\r
}\r
}\r
{\r
if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bAVI有効 ) )\r
{\r
- this.actAVI.t進行描画( (int) ( x * Scale.X ), (int) ( y * Scale.Y ) );\r
+ this.actAVI.t進行描画(x, y, 556, 710);\r
}\r
}\r
protected abstract void t進行描画_BGA();\r
\r
protected override void t進行描画_AVI()\r
{\r
- base.t進行描画_AVI( 0xb5, 50 );\r
+ base.t進行描画_AVI( 682, 112 );\r
}\r
protected override void t進行描画_BGA()\r
{\r
- base.t進行描画_BGA( 0xb5, 50 );\r
+ base.t進行描画_BGA( 682, 112 );\r
}\r
protected override void t進行描画_DANGER() // #23631 2011.4.19 yyagi\r
{\r
\r
protected override void t進行描画_AVI()\r
{\r
- base.t進行描画_AVI( 338, 57 );\r
+ base.t進行描画_AVI( 1153, 128 );\r
}\r
protected override void t進行描画_BGA()\r
{\r
- base.t進行描画_BGA( 338, 57 );\r
+ base.t進行描画_BGA( 1153, 128 );\r
}\r
protected override void t進行描画_DANGER()\r
{\r
//if ( ( ( this.nAVI再生開始時刻 != -1 ) && ( this.avi != null ) ) && ( this.sfリザルトAVI画像 != null ) )\r
if ( this.rAVI != null )\r
{\r
- this.actAVI.t進行描画( (int) ( x * Scale.X ), (int) ( y * Scale.Y ) );\r
+ this.actAVI.t進行描画( (int) ( x * Scale.X ), (int) ( y * Scale.Y ), 612, 605 );\r
}\r
#region [ プレビュー画像表示 ]\r
else if( this.r表示するリザルト画像 != null )\r
--- /dev/null
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+using System.Threading.Tasks;\r
+using System.Runtime.InteropServices;\r
+using DirectShowLib;\r
+using DirectShowLib.DES;\r
+using SlimDX;\r
+\r
+namespace FDK\r
+{\r
+ public class CAviDS : IDisposable\r
+ {\r
+ public uint nフレーム高さ\r
+ {\r
+ get\r
+ {\r
+ return (uint)nHeight;\r
+ }\r
+ }\r
+\r
+ public uint nフレーム幅\r
+ {\r
+ get\r
+ {\r
+ return (uint)nWidth;\r
+ }\r
+ }\r
+\r
+ IMediaDet mediaDet;\r
+ int nWidth;\r
+ int nHeight;\r
+ double mediaLength; // in second\r
+ VideoInfoHeader videoInfo;\r
+ IntPtr bufferPtr;\r
+\r
+ public int GetDuration()\r
+ {\r
+ return (int)(1000 * mediaLength);\r
+ }\r
+\r
+ // コンストラクタ\r
+ public CAviDS(string filename)\r
+ {\r
+ // DirectShow による AVI 再生\r
+ mediaDet = (IMediaDet)new MediaDet();\r
+ AMMediaType mediaType = null;\r
+ bufferPtr = IntPtr.Zero;\r
+\r
+ try\r
+ {\r
+ int nStreams;\r
+ Guid type = Guid.Empty;\r
+\r
+ mediaType = new AMMediaType();\r
+\r
+ // Set media filename\r
+ mediaDet.put_Filename(filename);\r
+\r
+ // Get the number of streams in that media\r
+ mediaDet.get_OutputStreams(out nStreams);\r
+ for (int nIndexStream = 0; nIndexStream < nStreams; ++nIndexStream)\r
+ {\r
+ mediaDet.put_CurrentStream(nIndexStream);\r
+ mediaDet.get_StreamType(out type);\r
+ if (type == MediaType.Video)\r
+ {\r
+ // This stream is video\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (type == MediaType.Video)\r
+ {\r
+ // Get video info ( width, height, media length (in second)\r
+ mediaDet.get_StreamMediaType(mediaType);\r
+ videoInfo = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.formatPtr, typeof(VideoInfoHeader));\r
+ DsUtils.FreeAMMediaType(mediaType);\r
+ mediaType = null;\r
+\r
+ nWidth = videoInfo.BmiHeader.Width;\r
+ nHeight = videoInfo.BmiHeader.Height;\r
+ mediaDet.get_StreamLength(out mediaLength);\r
+\r
+ // あらかじめテクスチャ用のメモリを確保\r
+ int bufferSize;\r
+ mediaDet.GetBitmapBits(1, out bufferSize, IntPtr.Zero, nWidth, nHeight);\r
+ bufferPtr = Marshal.AllocHGlobal(bufferSize);\r
+ }\r
+ }\r
+ catch (Exception e)\r
+ {\r
+ if (mediaType != null)\r
+ {\r
+ // free unmanaged resource if the exception is occured while obtaining videoinfo\r
+ DsUtils.FreeAMMediaType(mediaType);\r
+ }\r
+ throw new ArgumentException(String.Format("ファイルを正常に開けませんでした。\"{0}\", DirectShow による例外メッセージ: {1}", filename, e.Message));\r
+ }\r
+ }\r
+\r
+ public unsafe void tGetBitmap(SlimDX.Direct3D9.Device device, CTexture ctex, int timeInMs)\r
+ {\r
+ int bufferSize;\r
+ mediaDet.GetBitmapBits(timeInMs / 1000f, out bufferSize, IntPtr.Zero, nWidth, nHeight);\r
+ // データは R8G8B8\r
+ mediaDet.GetBitmapBits(timeInMs / 1000f, out bufferSize, bufferPtr, nWidth, nHeight);\r
+ byte* sourcePtr = (byte*)bufferPtr.ToPointer() + Marshal.SizeOf(videoInfo.BmiHeader);\r
+ int nBmpLineByte = (nWidth * 3) + ((4 - ((nWidth * 3) % 4)) % 4);\r
+\r
+ DataRectangle rectangle3 = ctex.texture.LockRectangle(0, SlimDX.Direct3D9.LockFlags.None);\r
+ rectangle3.Data.Seek(0, System.IO.SeekOrigin.Begin);\r
+ uint* outPtr = (uint*)rectangle3.Data.DataPointer.ToPointer();\r
+ for (int i = 0; i < nHeight; ++i)\r
+ {\r
+ for (int j = 0; j < nWidth; ++j)\r
+ {\r
+ byte B = *((sourcePtr + (((nHeight - i) - 1) * nBmpLineByte)) + (j * 3) + 0);\r
+ byte G = *((sourcePtr + (((nHeight - i) - 1) * nBmpLineByte)) + (j * 3) + 1);\r
+ byte R = *((sourcePtr + (((nHeight - i) - 1) * nBmpLineByte)) + (j * 3) + 2);\r
+ *(outPtr + (i * nWidth + j)) = ((uint)R << 16) | ((uint)G << 8) | B;\r
+ }\r
+ }\r
+ ctex.texture.UnlockRectangle(0);\r
+ }\r
+\r
+ #region [ Dispose-Finalize パターン実装 ]\r
+ //-----------------\r
+ public void Dispose()\r
+ {\r
+ if (!this.bDisposed)\r
+ {\r
+ if (bufferPtr != IntPtr.Zero)\r
+ {\r
+ Marshal.FreeHGlobal(bufferPtr);\r
+ bufferPtr = IntPtr.Zero;\r
+ }\r
+ GC.SuppressFinalize(this); // 2011.8.19 from: 忘れてた。\r
+ this.bDisposed = true;\r
+ }\r
+ }\r
+\r
+ ~CAviDS()\r
+ {\r
+ this.Dispose();\r
+ }\r
+ //-----------------\r
+ #endregion\r
+\r
+ private bool bDisposed = false;\r
+ }\r
+}\r