OSDN Git Service

9c783542392ac84cd44ea5c66d1563ab55face7d
[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 * this.loopCount; } }\r
21         public string methodName { get { return "D2DBitBlt"; } }\r
22         public int loopCount { get; set; }\r
23 \r
24         D2D1.Factory Factory2D;\r
25         DW.Factory FactoryDWrite;\r
26         WindowRenderTarget render;\r
27         Drawing.Size ClientSize;\r
28         Random rnd;\r
29         const string showStr = "D2DBenchMark";\r
30         Drawing.Size bmpSize;\r
31         D2D1.Bitmap bmp;\r
32 \r
33         public void Init(Control ctrl, bool antialias)\r
34         {\r
35             ClientSize = ctrl.ClientSize;\r
36             Factory2D = new SharpDX.Direct2D1.Factory();\r
37             FactoryDWrite = new SharpDX.DirectWrite.Factory();\r
38             HwndRenderTargetProperties hwndprops = new HwndRenderTargetProperties { Hwnd = ctrl.Handle, PixelSize = ClientSize, PresentOptions = PresentOptions.Immediately };\r
39             render = new WindowRenderTarget(Factory2D, new RenderTargetProperties(), hwndprops);\r
40             bmpSize = Resources.image.Size;\r
41             bmp = Load(render, Resources.image);\r
42             rnd = new Random();\r
43             render.AntialiasMode = antialias ? AntialiasMode.PerPrimitive : AntialiasMode.Aliased;\r
44         }\r
45 \r
46         public void Dispose()\r
47         {\r
48             bmp.Dispose();\r
49             render.Dispose();\r
50             Factory2D.Dispose();\r
51             FactoryDWrite.Dispose();\r
52         }\r
53 \r
54         public void Exec()\r
55         {\r
56             render.BeginDraw();\r
57             for (int i = 0; i < this.loopCount; i++)\r
58             {\r
59                 SharpDX.RectangleF rect = new SharpDX.RectangleF();\r
60                 rect.Left = rnd.Next(ClientSize.Width);\r
61                 rect.Top = rnd.Next(ClientSize.Height);\r
62                 rect.Right = rect.Left + bmpSize.Width;\r
63                 rect.Bottom = rect.Top + bmpSize.Height;\r
64                 render.DrawBitmap(bmp, rect, 1.0f, BitmapInterpolationMode.NearestNeighbor);\r
65             }\r
66             render.EndDraw();\r
67         }\r
68 \r
69         D2D1.Bitmap Load(WindowRenderTarget render, Drawing.Bitmap srcBitmap)\r
70         {\r
71             var bitmapData = srcBitmap.LockBits(\r
72                 new Drawing.Rectangle(0, 0, srcBitmap.Width, srcBitmap.Height),\r
73                 System.Drawing.Imaging.ImageLockMode.ReadOnly,\r
74                 System.Drawing.Imaging.PixelFormat.Format32bppPArgb);\r
75 \r
76             var stream = new DataStream(bitmapData.Scan0, bitmapData.Stride * bitmapData.Height, true, false);\r
77 \r
78             var properties = new BitmapProperties()\r
79             {\r
80                 PixelFormat = new D2D1.PixelFormat(SharpDX.DXGI.Format.B8G8R8A8_UNorm, AlphaMode.Premultiplied)\r
81             };\r
82             var bitmap = new D2D1.Bitmap(render, srcBitmap.Size, stream, bitmapData.Stride, properties);\r
83 \r
84             srcBitmap.UnlockBits(bitmapData);\r
85 \r
86             return bitmap;\r
87         }\r
88     }\r
89 }\r