OSDN Git Service

Merge branch 'ビュアーモード' into develop
[strokestylet/CsWin10Desktop3.git] / FDK24 / Utilities.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.Linq;
5
6 namespace FDK
7 {
8         public static class Utilities
9         {
10                 /// <summary>
11                 /// Dispose して、null を代入する。
12                 /// </summary>
13                 /// <param name="obj">IDisposable を実装するオブジェクト。</param>
14                 public static void 解放する<T>( ref T obj ) where T : IDisposable
15                 {
16                         ( obj as IDisposable )?.Dispose();
17                         obj = default( T );
18                 }
19
20                 /// <summary>
21                 /// ターゲットに対して描画処理を実行する。
22                 /// </summary>
23                 /// <remarks>
24                 /// 描画処理は、ターゲットの BeginDraw() と EndDraw() の間で行われることを保証する。
25                 /// 描画処理中に例外が発生しても EndDraw() の呼び出しは保証する。
26                 /// </remarks>
27                 /// <param name="target">レンダーターゲット。</param>
28                 /// <param name="描画処理">BeginDraw() と EndDraw() の間で行う処理。</param>
29                 public static void D2DBatchDraw( SharpDX.Direct2D1.RenderTarget target, Action 描画処理 )
30                 {
31                         target.BeginDraw();
32                         try
33                         {
34                                 描画処理();
35                         }
36                         finally
37                         {
38                                 // SharpDX の EndDraw() では HRESULT を捨ててしまうので、デバイスロストのチェックは、ここではできない。
39                                 target.EndDraw();
40                         }
41                 }
42                 /// <summary>
43                 /// 深度から射影行列(定数)を計算して返す。
44                 /// Direct2D 用。
45                 /// </summary>
46                 /// <param name="depth">深度。</param>
47                 /// <returns>深度から計算された射影行列。</returns>
48                 public static SharpDX.Matrix D2DPerspectiveProjection( float depth )
49                 {
50                         var mat = SharpDX.Matrix.Identity;
51                         mat.M34 = ( 0 != depth ) ? -( 1.0f / depth ) : 0.0f;
52                         return mat;
53                 }
54
55                 public static int 最大公約数を返す( int m, int n )
56                 {
57                         if( ( 0 >= m ) || ( 0 >= n ) )
58                                 throw new FDKException( "引数に0以下の数は指定できません。" );
59
60                         // ユーグリッドの互除法
61                         int r;
62                         while( ( r = m % n ) != 0 )
63                         {
64                                 m = n;
65                                 n = r;
66                         }
67
68                         return n;
69                 }
70                 public static int 最小公倍数を返す( int m, int n )
71                 {
72                         if( ( 0 >= m ) || ( 0 >= n ) )
73                                 throw new FDKException( "引数に0以下の数は指定できません。" );
74
75                         return ( m * n / Utilities.最大公約数を返す( m, n ) );
76                 }
77
78                 /// <summary>
79                 /// このメソッドの 呼び出し元のメソッド名 を返す。デバッグログ用。
80                 /// </summary>
81                 public static string 現在のメソッド名
82                 {
83                         get
84                         {
85                                 // 1つ前のスタックフレームを取得。
86                                 var prevFrame = new System.Diagnostics.StackFrame( skipFrames: 1, fNeedFileInfo: false );
87
88                                 var クラス名 = prevFrame.GetMethod().ReflectedType.ToString();
89                                 var メソッド名 = prevFrame.GetMethod().Name;
90
91                                 return $"{クラス名}.{メソッド名}()";
92                         }
93                 }
94
95                 /// <summary>
96                 /// 画像ファイルからシェーダリソースビューを作成して返す。
97                 /// </summary>
98                 /// <remarks>
99                 /// (参考: http://qiita.com/oguna/items/c516e09ee57d931892b6 )
100                 /// </remarks>
101                 public static SharpDX.Direct3D11.ShaderResourceView CreateShaderResourceViewFromFile(
102                         SharpDX.Direct3D11.Device d3dDevice, SharpDX.Direct3D11.BindFlags bindFlags, string 画像ファイルパス, out SharpDX.Size2F ビューのサイズ, out SharpDX.Direct3D11.Texture2D テクスチャ )
103                 {
104                         ビューのサイズ = new SharpDX.Size2F( 0, 0 );
105                         var srv = (SharpDX.Direct3D11.ShaderResourceView) null;
106                         using( var image = new System.Drawing.Bitmap( 画像ファイルパス ) )
107                         {
108                                 var 画像の矩形 = new System.Drawing.Rectangle( 0, 0, image.Width, image.Height );
109                                 using( var bitmap = image.Clone( 画像の矩形, System.Drawing.Imaging.PixelFormat.Format32bppArgb ) )
110                                 {
111                                         var ロック領域 = bitmap.LockBits( 画像の矩形, System.Drawing.Imaging.ImageLockMode.ReadOnly, bitmap.PixelFormat );
112                                         var dataBox = new[] { new SharpDX.DataBox( ロック領域.Scan0, bitmap.Width * 4, bitmap.Height ) };
113                                         var textureDesc = new SharpDX.Direct3D11.Texture2DDescription() {
114                                                 ArraySize = 1,
115                                                 BindFlags = bindFlags,
116                                                 CpuAccessFlags = SharpDX.Direct3D11.CpuAccessFlags.None,
117                                                 Format = SharpDX.DXGI.Format.B8G8R8A8_UNorm,
118                                                 Height = bitmap.Height,
119                                                 Width = bitmap.Width,
120                                                 MipLevels = 1,
121                                                 OptionFlags = SharpDX.Direct3D11.ResourceOptionFlags.None,
122                                                 SampleDescription = new SharpDX.DXGI.SampleDescription( 1, 0 ),
123                                                 Usage = SharpDX.Direct3D11.ResourceUsage.Default
124                                         };
125                                         var texture = new SharpDX.Direct3D11.Texture2D( d3dDevice, textureDesc, dataBox );
126                                         bitmap.UnlockBits( ロック領域 );
127                                         srv = new SharpDX.Direct3D11.ShaderResourceView( d3dDevice, texture );
128
129                                         // 戻り値2:テクスチャ
130                                         テクスチャ = texture;
131                                 }
132                                 // 戻り値1:ビューのサイズ
133                                 ビューのサイズ = new SharpDX.Size2F( 画像の矩形.Width, 画像の矩形.Height );
134                         }
135                         // 戻り値3:シェーダリソースビュー
136                         return srv;
137                 }
138
139                 /// <summary>
140                 /// 空のテクスチャとそのシェーダーリソースビューを作成し、返す。
141                 /// </summary>
142                 public static SharpDX.Direct3D11.ShaderResourceView CreateShaderResourceView(
143                         SharpDX.Direct3D11.Device d3dDevice, SharpDX.Direct3D11.BindFlags bindFlags, SharpDX.Size2 サイズdpx, out SharpDX.Direct3D11.Texture2D テクスチャ )
144                 {
145                         var textureDesc = new SharpDX.Direct3D11.Texture2DDescription() {
146                                 ArraySize = 1,
147                                 BindFlags = bindFlags,
148                                 CpuAccessFlags = SharpDX.Direct3D11.CpuAccessFlags.None,
149                                 Format = SharpDX.DXGI.Format.B8G8R8A8_UNorm,
150                                 Height = サイズdpx.Height,
151                                 Width = サイズdpx.Width,
152                                 MipLevels = 1,
153                                 OptionFlags = SharpDX.Direct3D11.ResourceOptionFlags.None,
154                                 SampleDescription = new SharpDX.DXGI.SampleDescription( 1, 0 ),
155                                 Usage = SharpDX.Direct3D11.ResourceUsage.Default
156                         };
157                         var texture = new SharpDX.Direct3D11.Texture2D( d3dDevice, textureDesc );
158
159                         // 戻り値1:テクスチャ
160                         テクスチャ = texture;
161
162                         // 戻り値2:シェーダリソースビュー
163                         return new SharpDX.Direct3D11.ShaderResourceView( d3dDevice, texture );
164                 }
165         }
166 }