OSDN Git Service

Boost.MSMでメニュー部分を実装
[shooting3/shootinggame.git] / ShootingGame / SampleOverlay.cpp
1 //// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
2 //// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
3 //// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
4 //// PARTICULAR PURPOSE.
5 ////
6 //// Copyright (c) Microsoft Corporation. All rights reserved
7
8 #include "pch.h"
9 #include "SampleOverlay.h"
10
11 using namespace Windows::UI::Core;
12 using namespace Windows::Foundation;
13 using namespace Microsoft::WRL;
14 using namespace Windows::UI::ViewManagement;
15 using namespace Windows::Graphics::Display;
16 using namespace D2D1;
17
18 SampleOverlay::SampleOverlay() :
19     m_drawOverlay(true)
20 {
21 }
22
23 void SampleOverlay::Initialize(
24     _In_ ID2D1Device*         d2dDevice, 
25     _In_ ID2D1DeviceContext*  d2dContext,
26     _In_ IWICImagingFactory*  wicFactory,
27     _In_ IDWriteFactory*      dwriteFactory,
28     _In_ Platform::String^    caption
29     )
30 {
31     m_wicFactory = wicFactory;
32     m_dwriteFactory = dwriteFactory;
33     m_sampleName = caption;
34     m_d2dDevice = d2dDevice;
35     m_d2dContext = d2dContext;
36     m_padding = 3.0f;
37     m_textVerticalOffset = 5.0f;
38     m_logoSize = D2D1::SizeF(0.0f, 0.0f);
39     m_overlayWidth = 0.0f;
40
41     ComPtr<ID2D1Factory> factory;
42     d2dDevice->GetFactory(&factory);
43
44     DX::ThrowIfFailed(
45         factory.As(&m_d2dFactory)
46         );
47
48     ResetDirectXResources();
49 }
50
51 void SampleOverlay::ResetDirectXResources()
52 {
53     DX::ThrowIfFailed(
54         m_d2dContext->CreateSolidColorBrush(ColorF(ColorF::White), &m_whiteBrush)
55         );
56
57     ComPtr<IWICBitmapDecoder> wicBitmapDecoder;
58     DX::ThrowIfFailed(
59         m_wicFactory->CreateDecoderFromFilename(
60             L"windowsbig-sdk.png",
61             nullptr,
62             GENERIC_READ,
63             WICDecodeMetadataCacheOnDemand,
64             &wicBitmapDecoder
65             )
66         );
67
68     ComPtr<IWICBitmapFrameDecode> wicBitmapFrame;
69     DX::ThrowIfFailed(
70         wicBitmapDecoder->GetFrame(0, &wicBitmapFrame)
71         );
72
73     ComPtr<IWICFormatConverter> wicFormatConverter;
74     DX::ThrowIfFailed(
75         m_wicFactory->CreateFormatConverter(&wicFormatConverter)
76         );
77
78     DX::ThrowIfFailed(
79         wicFormatConverter->Initialize(
80             wicBitmapFrame.Get(),
81             GUID_WICPixelFormat32bppPBGRA,
82             WICBitmapDitherTypeNone,
83             nullptr,
84             0.0,
85             WICBitmapPaletteTypeCustom  // the BGRA format has no palette so this value is ignored
86             )
87         );
88
89     double dpiX = 96.0f;
90     double dpiY = 96.0f;
91     DX::ThrowIfFailed(
92         wicFormatConverter->GetResolution(&dpiX, &dpiY)
93         );
94
95     DX::ThrowIfFailed(
96         m_d2dContext->CreateBitmapFromWicBitmap(
97             wicFormatConverter.Get(), 
98             BitmapProperties(
99                 PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED),
100                 static_cast<float>(dpiX),
101                 static_cast<float>(dpiY)
102                 ),
103             &m_logoBitmap
104             )
105         );
106
107     m_logoSize = m_logoBitmap->GetSize();
108
109     ComPtr<IDWriteTextFormat> nameTextFormat;
110     DX::ThrowIfFailed(
111         m_dwriteFactory->CreateTextFormat(
112             L"Segoe UI",
113             nullptr,
114             DWRITE_FONT_WEIGHT_LIGHT,
115             DWRITE_FONT_STYLE_NORMAL,
116             DWRITE_FONT_STRETCH_NORMAL,
117             36.0f,
118             L"en-US",
119             &nameTextFormat
120             )
121         );
122
123     DX::ThrowIfFailed(
124         nameTextFormat->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_LEADING)
125         );
126
127     DX::ThrowIfFailed(
128         nameTextFormat->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_NEAR)
129         );
130
131     DX::ThrowIfFailed(
132         m_dwriteFactory->CreateTextLayout(
133             m_sampleName->Data(),
134             m_sampleName->Length(),
135             nameTextFormat.Get(),
136             4096.0f,
137             4096.0f,
138             &m_textLayout
139             )
140         );
141
142     DWRITE_TEXT_METRICS metrics = {0};
143     DX::ThrowIfFailed(
144         m_textLayout->GetMetrics(&metrics)
145         );
146
147     m_overlayWidth = m_padding * 3.0f + m_logoSize.width + metrics.width;
148
149     DX::ThrowIfFailed(
150         m_d2dFactory->CreateDrawingStateBlock(&m_stateBlock)
151         );
152
153     UpdateForWindowSizeChange();
154 }
155
156 void SampleOverlay::UpdateForWindowSizeChange()
157 {
158     if (CoreWindow::GetForCurrentThread()->Bounds.Width < m_overlayWidth)
159     {
160         m_drawOverlay = false;
161     }
162     else
163     {
164         m_drawOverlay = true;
165     }
166 }
167
168 void SampleOverlay::Render()
169 {
170     if (m_drawOverlay)
171     {
172         m_d2dContext->SaveDrawingState(m_stateBlock.Get());
173
174         m_d2dContext->BeginDraw();
175         m_d2dContext->SetTransform(D2D1::Matrix3x2F::Identity());
176         m_d2dContext->DrawBitmap(
177             m_logoBitmap.Get(),
178             D2D1::RectF(m_padding, 0.0f, m_logoSize.width + m_padding, m_logoSize.height)
179             );
180
181         m_d2dContext->DrawTextLayout(
182             Point2F(m_logoSize.width + 2.0f * m_padding, m_textVerticalOffset),
183             m_textLayout.Get(),
184             m_whiteBrush.Get()
185             );
186
187         // We ignore the HRESULT returned as we want to application to handle the 
188         // error when it uses Direct2D next.
189         m_d2dContext->EndDraw();
190
191         m_d2dContext->RestoreDrawingState(m_stateBlock.Get());
192     }
193 }
194
195 float SampleOverlay::GetTitleHeightInDips()
196 {
197     return m_logoSize.height;
198 }