forked from LukasBanana/LLGL
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathC99Canvas.cpp
127 lines (97 loc) · 3.17 KB
/
C99Canvas.cpp
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
/*
* C99Canvas.cpp
*
* Copyright (c) 2015 Lukas Hermanns. All rights reserved.
* Licensed under the terms of the BSD 3-Clause license (see LICENSE.txt).
*/
#include <LLGL/Canvas.h>
#include <LLGL-C/Canvas.h>
#include "C99Internal.h"
#include "../sources/Core/CoreUtils.h"
#include "../sources/Core/Exception.h"
#include <vector>
#include <string>
#include <string.h>
// namespace LLGL {
using namespace LLGL;
#define LLGL_CALLBACK_WRAPPER(FUNC, ...) \
if (callbacks_.FUNC != NULL) { callbacks_.FUNC(LLGLCanvas{ &sender } LLGL_VA_ARGS(__VA_ARGS__)); }
class InternalCanvasEventListener final : public Canvas::EventListener
{
LLGLCanvasEventListener callbacks_;
public:
InternalCanvasEventListener(const LLGLCanvasEventListener* callbacks)
{
memcpy(&callbacks_, callbacks, sizeof(LLGLCanvasEventListener));
}
void OnQuit(Canvas& sender, bool& veto) override
{
LLGL_CALLBACK_WRAPPER(onQuit, &veto);
}
};
#undef LLGL_CALLBACK_WRAPPER
static std::vector<std::unique_ptr<Canvas>> g_Canvases;
static void ConvertCanvasDesc(CanvasDescriptor& dst, const LLGLCanvasDescriptor& src)
{
dst.title = src.title;
dst.flags = src.flags;
}
LLGL_C_EXPORT LLGLCanvas llglCreateCanvas(const LLGLCanvasDescriptor* canvasDesc)
{
LLGL_ASSERT_PTR(canvasDesc);
CanvasDescriptor internalCanvasDesc;
ConvertCanvasDesc(internalCanvasDesc, *canvasDesc);
g_Canvases.push_back(Canvas::Create(internalCanvasDesc));
return LLGLCanvas{ g_Canvases.back().get() };
}
LLGL_C_EXPORT void llglReleaseCanvas(LLGLCanvas canvas)
{
RemoveFromListIf(
g_Canvases,
[canvas](const std::unique_ptr<Canvas>& entry) -> bool
{
return (entry.get() == LLGL_PTR(Canvas, canvas));
}
);
}
LLGL_C_EXPORT void llglSetCanvasTitle(LLGLCanvas canvas, const wchar_t* title)
{
LLGL_PTR(Canvas, canvas)->SetTitle(title);
}
LLGL_C_EXPORT size_t llglGetCanvasTitle(LLGLCanvas canvas, size_t outTitleLength, wchar_t* outTitle)
{
UTF8String title = LLGL_PTR(Canvas, canvas)->GetTitle();
SmallVector<wchar_t> titleUTF16 = title.to_utf16();
if (outTitle != NULL)
{
outTitleLength = (outTitleLength < titleUTF16.size() ? outTitleLength : titleUTF16.size());
memcpy(outTitle, titleUTF16.data(), outTitleLength * sizeof(wchar_t));
}
return titleUTF16.size();
}
LLGL_C_EXPORT bool llglHasCanvasQuit(LLGLCanvas canvas)
{
return LLGL_PTR(Canvas, canvas)->HasQuit();
}
LLGL_C_EXPORT void llglSetCanvasUserData(LLGLCanvas canvas, void* userData)
{
LLGL_PTR(Canvas, canvas)->SetUserData(userData);
}
LLGL_C_EXPORT void* llglGetCanvasUserData(LLGLCanvas canvas)
{
return LLGL_PTR(const Canvas, canvas)->GetUserData();
}
LLGL_C_EXPORT int llglAddCanvasEventListener(LLGLCanvas canvas, const LLGLCanvasEventListener* eventListener)
{
return 0; //todo
}
LLGL_C_EXPORT void llglRemoveCanvasEventListener(LLGLCanvas canvas, int eventListenerID)
{
//todo
}
LLGL_C_EXPORT void llglPostCanvasQuit(LLGLCanvas canvas)
{
LLGL_PTR(Canvas, canvas)->PostQuit();
}
// } /namespace LLGL
// ================================================================================