OSDN Git Service

#xxxxx Dispose-Finalizeパターンの実装漏れを修正。ついでにリファクタリング。
authorfrom <from@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Sat, 20 Aug 2011 10:25:50 +0000 (10:25 +0000)
committerfrom <from@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Sat, 20 Aug 2011 10:25:50 +0000 (10:25 +0000)
git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/trunk@242 16f42ceb-6dc6-49c8-ba94-f2d53467949d

FDK17プロジェクト/コード/04.グラフィック/CAvi.cs

index 1d49f80..e271309 100644 (file)
@@ -47,12 +47,12 @@ namespace FDK
                                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
@@ -79,9 +79,8 @@ namespace FDK
                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
@@ -91,90 +90,95 @@ namespace FDK
                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
@@ -281,7 +285,7 @@ namespace FDK
 \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