-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathD2DRenderer.cpp
More file actions
188 lines (166 loc) · 5.82 KB
/
D2DRenderer.cpp
File metadata and controls
188 lines (166 loc) · 5.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#include "stdafx.h"
#include "D2DRenderer.h"
/*****************************************************
## D2DRenderer ##
*******************************************************/
D2DRenderer::D2DRenderer()
:mD2DFactory(nullptr), mD2DRenderTarget(nullptr), mDWFactory(nullptr)
{
this->CreateFactory();
this->CreateRenderTarget();
this->CreateDefaultBrush();
this->AddTextFormat(L"맑은고딕");
this->AddTextBoldFormat(L"맑은고딕Bold");
mD2DRenderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);
}
/*****************************************************
## ~D2DRenderer ##
*******************************************************/
D2DRenderer::~D2DRenderer()
{
TextIter iter = mFontList.begin();
for (; iter != mFontList.end(); ++iter)
NEW_SAFE_RELEASE(iter->second);
for (UINT i = 0; i < (UINT)DefaultBrush::End; ++i)
NEW_SAFE_RELEASE(mDefaultBrushList[i]);
NEW_SAFE_RELEASE(mDWFactory);
NEW_SAFE_RELEASE(mD2DSurface);
NEW_SAFE_RELEASE(mD2DRenderTarget);
NEW_SAFE_RELEASE(mD2DFactory);
}
/*****************************************************
## BeginRender ##
*******************************************************/
void D2DRenderer::BeginRender(const D2D1::ColorF& backgroundColor)
{
mD2DRenderTarget->BeginDraw();
mD2DRenderTarget->Clear(backgroundColor);
}
/*****************************************************
## EndRender ##
*******************************************************/
void D2DRenderer::EndRender()
{
mD2DRenderTarget->EndDraw();
}
/*****************************************************
## CreateFactory ##
*******************************************************/
void D2DRenderer::CreateFactory()
{
//class Item
//{
//private: // 무분별하게 쓰기싫을때 생성자를 private로
// friend class Factory;
// Item() {}
// ~Item() {}
//};
//class Factory // 팩토리 디자인 패턴
//{
//public:
// Item* CreateItem() {
// return new Item();
// }
//};
// 1) D2D 팩토리 생성
// 싱글쓰레드타입으로
HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &mD2DFactory);
#ifdef _DEBUG
assert(SUCCEEDED(hr)); // E_FAIL이 들어오면 멈춘다.
#endif
// 2) DWriteFactory 생성
hr = DWriteCreateFactory(
DWRITE_FACTORY_TYPE_SHARED,
__uuidof(*&mDWFactory),
(IUnknown**)&mDWFactory
);
#ifdef _DEBUG
assert(SUCCEEDED(hr));
#endif
}
/*****************************************************
## CreateRenderTarget ##
*******************************************************/
void D2DRenderer::CreateRenderTarget()
{
// 랜더 타겟이란 백버퍼의 역할을 하는 클래스이자 여러 랜더링을 위한 유틸적인 것들이 들어있는 클래스이다.
// 그래서 화면에 뭔가 랜더링을 요청하려면 랜더타겟을 통해서만 가능 하다.
//스왑체인으로부터 백버퍼 정보 받아온다.
HRESULT hr;
// 1) 윈도우 핸들을 통해서 화면 Rect를 받아온다.(GetClientRect())
RECT clientRect;
GetClientRect(_hWnd, &clientRect);
// 이전에는 Factory를 통해서 현재 디바이스의 DPI를 받아 왔으나 어떤 이유에서인지 MS에서 해당 함수를 사용하지 못하게 변경함, 자체 API함수로 불러오자
// mD2DFactory->GetDesktopDpi(&dpiX, &dpiY)
// 2) 디바이스의 DPI정보를 받아온다. (WinAPI 함수)
FLOAT dpiX = GetDeviceCaps(_hdc, LOGPIXELSX);
FLOAT dpiY = GetDeviceCaps(_hdc, LOGPIXELSY);
// 3) 랜더타겟을 생성하기 위한 속성 값들을 초기화.
D2D1_RENDER_TARGET_PROPERTIES renderTargetProperties = D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT,
D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED), dpiX, dpiY);
// 4) 랜더타겟의 사이즈 초기화(화면 크기로)
D2D1_SIZE_U renderTargetSize = D2D1::SizeU(clientRect.right - clientRect.left, clientRect.bottom - clientRect.top);
// 5) 랜더타겟의 생성
hr = mD2DFactory->CreateHwndRenderTarget(
renderTargetProperties,
D2D1::HwndRenderTargetProperties(_hWnd, renderTargetSize),
&mD2DRenderTarget
);
assert(SUCCEEDED(hr));
}
/*****************************************************
## CreateDefaultBrush ##
*******************************************************/
void D2DRenderer::CreateDefaultBrush()
{
this->mD2DRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Black, 1.0f), &mDefaultBrushList[(UINT)DefaultBrush::Black]);
this->mD2DRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::White, 1.0f), &mDefaultBrushList[(UINT)DefaultBrush::White]);
this->mD2DRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Yellow, 1.0f), &mDefaultBrushList[(UINT)DefaultBrush::Yellow]);
this->mD2DRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Red, 1.0f), &mDefaultBrushList[(UINT)DefaultBrush::Red]);
this->mD2DRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Blue, 1.0f), &mDefaultBrushList[(UINT)DefaultBrush::Blue]);
this->mD2DRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Green, 1.0f), &mDefaultBrushList[(UINT)DefaultBrush::Green]);
this->mD2DRenderTarget->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Gray, 1.0f), &mDefaultBrushList[(UINT)DefaultBrush::Gray]);
}
/*****************************************************
## AddTextFormat ##
@@ wstring font : 폰트명
@@ float defaultSize : 폰트 사이즈 = 1.f
*******************************************************/
void D2DRenderer::AddTextFormat(const wstring& font, const float& defaultSize)
{
HRESULT hr;
IDWriteTextFormat* format = NULL;
hr = this->mDWFactory->CreateTextFormat(
font.c_str(),
NULL,
DWRITE_FONT_WEIGHT_REGULAR,
DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
defaultSize,
L"ko",
&format
);
#ifdef _DEBUG
assert(SUCCEEDED(hr));
#endif
this->mFontList.insert(make_pair(font, format));
}
void D2DRenderer::AddTextBoldFormat(const wstring& font, const float& defaultSize)
{
HRESULT hr;
IDWriteTextFormat* format = NULL;
hr = this->mDWFactory->CreateTextFormat(
font.c_str(),
NULL,
DWRITE_FONT_WEIGHT_BOLD,
DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
defaultSize,
L"ko",
&format
);
#ifdef _DEBUG
assert(SUCCEEDED(hr));
#endif
this->mFontList.insert(make_pair(font, format));
}