OSDN Git Service

SVNから移行した
[d2dbench/d2dbench.git] / D2DBench / Method4.cs
1 using System;\r
2 using System.Drawing;\r
3 using System.Drawing.Imaging;\r
4 using System.Diagnostics;\r
5 using System.Windows.Forms;\r
6 using D2DBench.Properties;\r
7 using SharpDX;\r
8 using SharpDX.Direct2D1;\r
9 using SharpDX.DirectWrite;\r
10 using System.Runtime.InteropServices;\r
11 \r
12 using D2D1 = SharpDX.Direct2D1;\r
13 using DW = SharpDX.DirectWrite;\r
14 using Drawing = System.Drawing;\r
15 \r
16 namespace D2DBench\r
17 {\r
18     class Method4 : IBench\r
19     {\r
20         public int fillAreaSize { get { return bmpSize.Width * bmpSize.Height * Form1.ExecuteCountPerOneset; } }\r
21         public string methodName { get { return "D2DBitBlt"; } }\r
22 \r
23         D2D1.Factory Factory2D;\r
24         DW.Factory FactoryDWrite;\r
25         WindowRenderTarget render;\r
26         Drawing.Size ClientSize;\r
27         Random rnd;\r
28         const string showStr = "D2DBenchMark";\r
29         Drawing.Size bmpSize;\r
30         D2D1.Bitmap bmp;\r
31 \r
32         public void Init(Control ctrl, bool antialias)\r
33         {\r
34             ClientSize = ctrl.ClientSize;\r
35             Factory2D = new SharpDX.Direct2D1.Factory();\r
36             FactoryDWrite = new SharpDX.DirectWrite.Factory();\r
37             HwndRenderTargetProperties hwndprops = new HwndRenderTargetProperties { Hwnd = ctrl.Handle, PixelSize = ClientSize, PresentOptions = PresentOptions.Immediately };\r
38             render = new WindowRenderTarget(Factory2D, new RenderTargetProperties(), hwndprops);\r
39             bmpSize = Resources.image.Size;\r
40             bmp = Load(render, Resources.image);\r
41             rnd = new Random();\r
42             render.AntialiasMode = antialias ? AntialiasMode.PerPrimitive : AntialiasMode.Aliased;\r
43         }\r
44 \r
45         public void Dispose()\r
46         {\r
47             bmp.Dispose();\r
48             render.Dispose();\r
49             Factory2D.Dispose();\r
50             FactoryDWrite.Dispose();\r
51         }\r
52 \r
53         public void Exec()\r
54         {\r
55             render.BeginDraw();\r
56             for (int i = 0; i < Form1.ExecuteCountPerOneset; i++)\r
57             {\r
58                 SharpDX.RectangleF rect = new SharpDX.RectangleF();\r
59                 rect.Left = rnd.Next(ClientSize.Width);\r
60                 rect.Top = rnd.Next(ClientSize.Height);\r
61                 rect.Right = rect.Left + bmpSize.Width;\r
62                 rect.Bottom = rect.Top + bmpSize.Height;\r
63                 render.DrawBitmap(bmp, rect, 1.0f, BitmapInterpolationMode.NearestNeighbor);\r
64             }\r
65             render.EndDraw();\r
66         }\r
67 \r
68         D2D1.Bitmap Load(WindowRenderTarget render, Drawing.Bitmap srcBitmap)\r
69         {\r
70             var bitmapData = srcBitmap.LockBits(\r
71                 new Drawing.Rectangle(0, 0, srcBitmap.Width, srcBitmap.Height),\r
72                 System.Drawing.Imaging.ImageLockMode.ReadOnly,\r
73                 System.Drawing.Imaging.PixelFormat.Format32bppPArgb);\r
74 \r
75             var stream = new DataStream(bitmapData.Scan0, bitmapData.Stride * bitmapData.Height, true, false);\r
76 \r
77             var properties = new BitmapProperties()\r
78             {\r
79                 PixelFormat = new D2D1.PixelFormat(SharpDX.DXGI.Format.B8G8R8A8_UNorm, AlphaMode.Premultiplied)\r
80             };\r
81             var bitmap = new D2D1.Bitmap(render, srcBitmap.Size, stream, bitmapData.Stride, properties);\r
82 \r
83             srcBitmap.UnlockBits(bitmapData);\r
84 \r
85             return bitmap;\r
86         }\r
87     }\r
88 }\r