this.Release();\r
throw new Exception( "AVIFileGetStream failed." );\r
}\r
- AVISTREAMINFO psi = new AVISTREAMINFO();\r
- AVIStreamInfo( this.aviStream, ref psi, Marshal.SizeOf( psi ) );\r
- this.dwレート = psi.dwRate;\r
- this.dwスケール = psi.dwScale;\r
- this.nフレーム幅 = psi.rcFrame.right - psi.rcFrame.left;\r
- this.nフレーム高さ = psi.rcFrame.bottom - psi.rcFrame.top;\r
+ var info = new AVISTREAMINFO();\r
+ AVIStreamInfo( this.aviStream, ref info, Marshal.SizeOf( info ) );\r
+ this.dwレート = info.dwRate;\r
+ this.dwスケール = info.dwScale;\r
+ this.nフレーム幅 = info.rcFrame.right - info.rcFrame.left;\r
+ this.nフレーム高さ = info.rcFrame.bottom - info.rcFrame.top;\r
try\r
{\r
this.frame = AVIStreamGetFrameOpen( this.aviStream, 0 );\r
public Bitmap GetFrame( int no )\r
{\r
if( this.aviStream == IntPtr.Zero )\r
- {\r
throw new InvalidOperationException();\r
- }\r
+\r
return BitmapUtil.ToBitmap( AVIStreamGetFrame( this.frame, no ) );\r
}\r
public int GetFrameNoFromTime( int time )\r
public IntPtr GetFramePtr( int no )\r
{\r
if( this.aviStream == IntPtr.Zero )\r
- {\r
throw new InvalidOperationException();\r
- }\r
+\r
return AVIStreamGetFrame( this.frame, no );\r
}\r
public int GetMaxFrameCount()\r
{\r
if( this.aviStream == IntPtr.Zero )\r
- {\r
throw new InvalidOperationException();\r
- }\r
+\r
return AVIStreamLength( this.aviStream );\r
}\r
\r
public unsafe void tBitmap24ToGraphicsStreamR5G6B5( BitmapUtil.BITMAPINFOHEADER* pBITMAPINFOHEADER, DataStream gs, int nWidth, int nHeight )\r
{\r
- int num = pBITMAPINFOHEADER->biWidthビットマップの幅dot;\r
- int num2 = pBITMAPINFOHEADER->biHeightビットマップの高さdot;\r
- int num3 = ( num * 3 ) + ( ( 4 - ( ( num * 3 ) % 4 ) ) % 4 );\r
- ushort* numPtr = (ushort*) gs.DataPointer.ToPointer();\r
- byte* numPtr2 = (byte*) ( pBITMAPINFOHEADER + 1 );\r
- for( int i = 0; i < num2; i++ )\r
+ int nBmpWidth = pBITMAPINFOHEADER->biWidthビットマップの幅dot;\r
+ int nBmpHeight = pBITMAPINFOHEADER->biHeightビットマップの高さdot;\r
+ int nBmpLineByte = ( nBmpWidth * 3 ) + ( ( 4 - ( ( nBmpWidth * 3 ) % 4 ) ) % 4 );\r
+\r
+ ushort* pTexture = (ushort*) gs.DataPointer.ToPointer();\r
+ byte* pBitmap = (byte*) ( pBITMAPINFOHEADER + 1 );\r
+ \r
+ for( int i = 0; i < nBmpHeight; i++ )\r
{\r
if( i >= nHeight )\r
- {\r
- return;\r
- }\r
- for( int j = 0; j < num; j++ )\r
+ break;\r
+\r
+ for( int j = 0; j < nBmpWidth; j++ )\r
{\r
if( j >= nWidth )\r
- {\r
break;\r
- }\r
- ushort num6 = (ushort) ( ( ( numPtr2 + ( ( ( num2 - i ) - 1 ) * num3 ) )[ j * 3 ] >> 3 ) & 0x1f );\r
- ushort num5 = (ushort) ( ( ( ( numPtr2 + ( ( ( num2 - i ) - 1 ) * num3 ) ) + ( j * 3 ) )[ 1 ] >> 2 ) & 0x3f );\r
- ushort num4 = (ushort) ( ( ( ( numPtr2 + ( ( ( num2 - i ) - 1 ) * num3 ) ) + ( j * 3 ) )[ 2 ] >> 3 ) & 0x1f );\r
- ( numPtr + ( i * nWidth ) )[ j ] = (ushort) ( ( ( num4 << 11 ) | ( num5 << 5 ) ) | num6 );\r
+\r
+ ushort B = (ushort) ( ( *( ( pBitmap + ( ( ( nBmpHeight - i ) - 1 ) * nBmpLineByte ) ) + ( j * 3 ) + 0 ) >> 3 ) & 0x1f );\r
+ ushort G = (ushort) ( ( *( ( pBitmap + ( ( ( nBmpHeight - i ) - 1 ) * nBmpLineByte ) ) + ( j * 3 ) + 1 ) >> 2 ) & 0x3f );\r
+ ushort R = (ushort) ( ( *( ( pBitmap + ( ( ( nBmpHeight - i ) - 1 ) * nBmpLineByte ) ) + ( j * 3 ) + 2 ) >> 3 ) & 0x1f );\r
+ *( pTexture + ( i * nWidth ) + j ) = (ushort) ( ( R << 11 ) | ( G << 5 ) | B );\r
}\r
}\r
}\r
public unsafe void tBitmap24ToGraphicsStreamX8R8G8B8( BitmapUtil.BITMAPINFOHEADER* pBITMAPINFOHEADER, DataStream ds, int nWidth, int nHeight )\r
{\r
- int num = pBITMAPINFOHEADER->biWidthビットマップの幅dot;\r
- int num2 = pBITMAPINFOHEADER->biHeightビットマップの高さdot;\r
- int num3 = ( num * 3 ) + ( ( 4 - ( ( num * 3 ) % 4 ) ) % 4 );\r
- uint* numPtr = (uint*) ds.DataPointer.ToPointer();\r
- byte* numPtr2 = (byte*) ( pBITMAPINFOHEADER + 1 );\r
- for( int i = 0; i < num2; i++ )\r
+ int nBmpWidth = pBITMAPINFOHEADER->biWidthビットマップの幅dot;\r
+ int nBmpHeight = pBITMAPINFOHEADER->biHeightビットマップの高さdot;\r
+ int nBmpLineByte = ( nBmpWidth * 3 ) + ( ( 4 - ( ( nBmpWidth * 3 ) % 4 ) ) % 4 );\r
+ \r
+ uint* pTexture = (uint*) ds.DataPointer.ToPointer();\r
+ byte* pBitmap = (byte*) ( pBITMAPINFOHEADER + 1 );\r
+ \r
+ for( int i = 0; i < nBmpHeight; i++ )\r
{\r
if( i >= nHeight )\r
- {\r
- return;\r
- }\r
- for( int j = 0; j < num; j++ )\r
+ break;\r
+\r
+ for( int j = 0; j < nBmpWidth; j++ )\r
{\r
if( j >= nWidth )\r
- {\r
break;\r
- }\r
- uint num6 = ( numPtr2 + ( ( ( num2 - i ) - 1 ) * num3 ) )[ j * 3 ];\r
- uint num5 = ( ( numPtr2 + ( ( ( num2 - i ) - 1 ) * num3 ) ) + ( j * 3 ) )[ 1 ];\r
- uint num4 = ( ( numPtr2 + ( ( ( num2 - i ) - 1 ) * num3 ) ) + ( j * 3 ) )[ 2 ];\r
- ( numPtr + ( i * nWidth ) )[ j ] = ( ( num4 << 0x10 ) | ( num5 << 8 ) ) | num6;\r
+\r
+ uint B = *( ( pBitmap + ( ( ( nBmpHeight - i ) - 1 ) * nBmpLineByte ) ) + ( j * 3 ) + 0 );\r
+ uint G = *( ( pBitmap + ( ( ( nBmpHeight - i ) - 1 ) * nBmpLineByte ) ) + ( j * 3 ) + 1 );\r
+ uint R = *( ( pBitmap + ( ( ( nBmpHeight - i ) - 1 ) * nBmpLineByte ) ) + ( j * 3 ) + 2 );\r
+ *( pTexture + ( i * nWidth ) + j ) = ( R << 16 ) | ( G << 8 ) | B;\r
}\r
}\r
}\r
\r
- #region [ IDisposable+α 実装 ]\r
+ #region [ Dispose-Finalize パターン実装 ]\r
//-----------------\r
public void Dispose()\r
{\r
this.Dispose( true );\r
+ GC.SuppressFinalize( this ); // 2011.8.19 from: 忘れてた。\r
}\r
protected void Dispose( bool disposeManagedObjects )\r
{\r
- if( !this.bDispose完了済み )\r
+ if( this.bDispose完了済み )\r
+ return;\r
+\r
+ if( disposeManagedObjects )\r
{\r
- if( this.frame != IntPtr.Zero )\r
- {\r
- AVIStreamGetFrameClose( this.frame );\r
- }\r
- this.Release();\r
- this.bDispose完了済み = true;\r
+ // (A) Managed リソースの解放\r
}\r
+\r
+ // (B) Unamanaged リソースの解放\r
+\r
+ if( this.frame != IntPtr.Zero )\r
+ AVIStreamGetFrameClose( this.frame );\r
+\r
+ this.Release();\r
+ this.bDispose完了済み = true;\r
}\r
~CAvi()\r
{\r
\r
private static uint mmioFOURCC( char c0, char c1, char c2, char c3 )\r
{\r
- return ( ( ( ( (uint) c3 << 0x18 ) | ( (uint) c2 << 0x10 ) ) | ( (uint) c1 << 8 ) ) | (uint) c0 );\r
+ return ( (uint) c3 << 0x18 ) | ( (uint) c2 << 0x10 ) | ( (uint) c1 << 0x08 ) | (uint) c0;\r
}\r
private void Release()\r
{\r