Skip to content

Commit 43ea161

Browse files
committed
Добавьте файлы проекта.
1 parent 14324a5 commit 43ea161

17 files changed

Lines changed: 1647 additions & 0 deletions

libmulti.sln

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio 14
4+
VisualStudioVersion = 14.0.25420.1
5+
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmulti", "libmulti\libmulti.vcxproj", "{03037464-8908-482D-ACAD-258FE31E2506}"
7+
EndProject
8+
Global
9+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
10+
Debug|x64 = Debug|x64
11+
Debug|x86 = Debug|x86
12+
Release|x64 = Release|x64
13+
Release|x86 = Release|x86
14+
EndGlobalSection
15+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
16+
{03037464-8908-482D-ACAD-258FE31E2506}.Debug|x64.ActiveCfg = Debug|x64
17+
{03037464-8908-482D-ACAD-258FE31E2506}.Debug|x64.Build.0 = Debug|x64
18+
{03037464-8908-482D-ACAD-258FE31E2506}.Debug|x86.ActiveCfg = Debug|Win32
19+
{03037464-8908-482D-ACAD-258FE31E2506}.Debug|x86.Build.0 = Debug|Win32
20+
{03037464-8908-482D-ACAD-258FE31E2506}.Release|x64.ActiveCfg = Release|x64
21+
{03037464-8908-482D-ACAD-258FE31E2506}.Release|x64.Build.0 = Release|x64
22+
{03037464-8908-482D-ACAD-258FE31E2506}.Release|x86.ActiveCfg = Release|Win32
23+
{03037464-8908-482D-ACAD-258FE31E2506}.Release|x86.Build.0 = Release|Win32
24+
EndGlobalSection
25+
GlobalSection(SolutionProperties) = preSolution
26+
HideSolutionNode = FALSE
27+
EndGlobalSection
28+
EndGlobal

libmulti/MultiD2D.cpp

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
#include "stdafx.h"
2+
#include "MultiD2D.h"
3+
4+
#define SafeRelease(_Interface) if (*(_Interface) != nullptr) { (*(_Interface))->Release(); (*(_Interface)) = nullptr; }
5+
6+
CRITICAL_SECTION ms_FactoryMutex{ 0 };
7+
ID2D1Factory* ms_Factory{ nullptr };
8+
9+
void EnterFactory(void) { EnterCriticalSection(&ms_FactoryMutex); }
10+
void LeaveFactory(void) { LeaveCriticalSection(&ms_FactoryMutex); }
11+
12+
void InitMultiD2D(void) {
13+
InitializeCriticalSection(&ms_FactoryMutex);
14+
EnterFactory();
15+
D2D1CreateFactory(D2D1_FACTORY_TYPE::D2D1_FACTORY_TYPE_MULTI_THREADED, &ms_Factory);
16+
LeaveFactory();
17+
18+
printf(__FUNCTION__ ": hello!\n");
19+
fflush(stdout);
20+
}
21+
22+
CMultiD2D::CMultiD2D() : m_bitmap(nullptr), m_rt(nullptr), m_bitmapW(0), m_bitmapH(0), m_bitmapP(nullptr), m_mutex(new CRITICAL_SECTION()) {
23+
InitializeCriticalSection(this->m_mutex);
24+
}
25+
26+
CMultiD2D::~CMultiD2D() {
27+
this->Discard();
28+
29+
this->enter();
30+
this->m_bitmapP = nullptr;
31+
this->m_bitmapW = 0;
32+
this->m_bitmapH = 0;
33+
this->leave();
34+
35+
DeleteCriticalSection(this->m_mutex);
36+
delete this->m_mutex;
37+
this->m_mutex = nullptr;
38+
}
39+
40+
void CMultiD2D::enter(void) { EnterCriticalSection(this->m_mutex); }
41+
void CMultiD2D::leave(void) { LeaveCriticalSection(this->m_mutex); }
42+
43+
void CMultiD2D::Discard(void) {
44+
this->enter();
45+
SafeRelease(&this->m_bitmap);
46+
SafeRelease(&this->m_rt);
47+
this->leave();
48+
}
49+
50+
HRESULT CMultiD2D::Create(HWND window) {
51+
HRESULT hR = S_OK;
52+
FLOAT dpiX = 0.0f, dpiY = 0.0f;
53+
54+
this->enter();
55+
56+
EnterFactory();
57+
if (this->m_rt == nullptr) {
58+
RECT rc;
59+
GetClientRect(window, &rc);
60+
D2D1_SIZE_U size = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top);
61+
hR = ms_Factory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(), D2D1::HwndRenderTargetProperties(window, size), &this->m_rt);
62+
}
63+
ms_Factory->GetDesktopDpi(&dpiX, &dpiY);
64+
LeaveFactory();
65+
66+
if (SUCCEEDED(hR) && this->m_bitmapP != nullptr && this->m_bitmap == nullptr) {
67+
D2D1_SIZE_U bmsize = D2D1::SizeU(this->m_bitmapW, this->m_bitmapH);
68+
D2D1_BITMAP_PROPERTIES props;
69+
props.dpiX = dpiX;
70+
props.dpiY = dpiY;
71+
props.pixelFormat.alphaMode = D2D1_ALPHA_MODE::D2D1_ALPHA_MODE_IGNORE;
72+
props.pixelFormat.format = DXGI_FORMAT::DXGI_FORMAT_B8G8R8A8_UNORM;
73+
hR = this->m_rt->CreateBitmap(bmsize, this->m_bitmapP, this->m_bitmapW * 4, props, &this->m_bitmap);
74+
}
75+
76+
this->leave();
77+
return hR;
78+
}
79+
80+
HRESULT CMultiD2D::OnResize(UINT w, UINT h) {
81+
HRESULT hR = S_OK;
82+
83+
this->enter();
84+
if (this->m_rt != nullptr) {
85+
hR = this->m_rt->Resize(D2D1::SizeU(w, h));
86+
if (SUCCEEDED(hR)) {
87+
//printf("OnResize ok. w=%ud,h=%ud\r\n", w, h);
88+
}
89+
}
90+
this->leave();
91+
92+
return hR;
93+
}
94+
95+
HRESULT CMultiD2D::OnRender(void) {
96+
HRESULT hR = S_OK;
97+
this->enter();
98+
99+
if (this->m_rt != nullptr && this->m_bitmap != nullptr) {
100+
this->m_rt->BeginDraw();
101+
this->m_rt->SetTransform(D2D1::Matrix3x2F::Identity());
102+
this->m_rt->Clear(D2D1::ColorF(D2D1::ColorF::Black));
103+
104+
// source rectangle, always occupy the whole bitmap, always.
105+
D2D1_SIZE_F bmsiz = this->m_bitmap->GetSize();
106+
D2D1_RECT_F source = D2D1::RectF(0.0f, 0.0f, bmsiz.width, bmsiz.height);
107+
108+
// change this:
109+
// right now it's just drawing bitmap in the center.
110+
D2D1_SIZE_F rtsiz = this->m_rt->GetSize();
111+
D2D1_RECT_F dest = D2D1::RectF(
112+
rtsiz.width / 2 - source.right / 2,
113+
rtsiz.height / 2 - source.bottom / 2,
114+
rtsiz.width / 2 + source.right / 2,
115+
rtsiz.height / 2 + source.bottom / 2
116+
);
117+
118+
this->m_rt->DrawBitmap(this->m_bitmap, dest, 1.0f, D2D1_BITMAP_INTERPOLATION_MODE::D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR, source);
119+
hR = this->m_rt->EndDraw();
120+
}
121+
122+
this->leave();
123+
124+
if (hR == D2DERR_RECREATE_TARGET) {
125+
hR = S_OK; // that's what MSDN docs tell me to do.
126+
this->Discard();
127+
}
128+
129+
return hR;
130+
}
131+
132+
HRESULT CMultiD2D::SetBitmap(UINT w, UINT h, void* data) {
133+
this->enter();
134+
this->m_bitmapW = w;
135+
this->m_bitmapH = h;
136+
this->m_bitmapP = data;
137+
this->leave();
138+
this->Discard();
139+
return S_OK;
140+
}

libmulti/MultiD2D.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#pragma once
2+
#include "stdafx.h"
3+
4+
void InitMultiD2D(void); // Initializes the factory, must be called once.
5+
6+
class CMultiD2D {
7+
private:
8+
ID2D1HwndRenderTarget* m_rt;
9+
ID2D1Bitmap* m_bitmap;
10+
CRITICAL_SECTION* m_mutex;
11+
12+
// user defined bitmap they wish to use
13+
// separately because D2D may want us to Release and Create an ID2D1Bitmap again
14+
UINT m_bitmapW;
15+
UINT m_bitmapH;
16+
void* m_bitmapP;
17+
18+
// mutex stuff
19+
void enter(void);
20+
void leave(void);
21+
public:
22+
23+
CMultiD2D();
24+
~CMultiD2D();
25+
26+
void Discard(void); // Releases all resources EXCEPT for the user defined bitmap.
27+
HRESULT Create(HWND window);
28+
HRESULT OnResize(UINT w, UINT h);
29+
HRESULT OnRender(void);
30+
HRESULT SetBitmap(UINT w, UINT h, void* data);
31+
};

libmulti/ReadMe.txt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
========================================================================
2+
БИБЛИОТЕКА ДИНАМИЧЕСКОЙ КОМПОНОВКИ. Обзор проекта libmulti
3+
========================================================================
4+
5+
Эта библиотека DLL libmulti создана автоматически с помощью мастера приложений.
6+
7+
В этом файле представлена сводка содержимого всех файлов, входящих в состав приложения libmulti.
8+
9+
10+
libmulti.vcxproj
11+
Это основной файл проекта VC++, создаваемый с помощью мастера приложений. Он содержит данные о версии языка Visual C++, использованной для создания файла, а также сведения о платформах, конфигурациях и функциях проекта, выбранных с помощью мастера приложений.
12+
13+
libmulti.vcxproj.filters
14+
Это файл фильтров для проектов VC++, созданный с помощью мастера приложений. Он содержит сведения о сопоставлениях между файлами в вашем проекте и фильтрами. Эти сопоставления используются в среде IDE для группировки файлов с одинаковыми расширениями в одном узле (например CPP-файлы сопоставляются с фильтром "Исходные файлы").
15+
16+
libmulti.cpp
17+
Основной исходный файл библиотеки DLL.
18+
19+
/////////////////////////////////////////////////////////////////////////////
20+
Другие стандартные файлы:
21+
22+
StdAfx.h, StdAfx.cpp
23+
Эти файлы используются для построения файла предкомпилированного заголовка (PCH) с именем libmulti.pch и файла предкомпилированных типов с именем StdAfx.obj.
24+
25+
/////////////////////////////////////////////////////////////////////////////
26+
Прочие примечания.
27+
28+
С помощью комментариев «TODO:» в мастере приложений обозначаются фрагменты исходного кода, которые необходимо дополнить или изменить.
29+
30+
/////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)