9120e874 Andy McCall 25 days ago
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
#if defined (_MSC_VER) && !defined (_CRT_SECURE_NO_WARNINGS)
27
#define _CRT_SECURE_NO_WARNINGS
28
#endif
29
30
#ifndef IMGUI_DEFINE_MATH_OPERATORS
31
#define IMGUI_DEFINE_MATH_OPERATORS
32
#endif
33
34
#include " imgui.h"
35
#ifndef IMGUI_DISABLE
36
#include " imgui_internal.h"
37
#ifdef IMGUI_ENABLE_FREETYPE
38
#include " misc/freetype/imgui_freetype.h"
39
#endif
40
41
#include < stdio.h>
42
43
44
#ifdef _MSC_VER
45
#pragma warning (disable: 4127)
46
#pragma warning (disable: 4505)
47
#pragma warning (disable: 4996)
48
#pragma warning (disable: 26451)
49
#pragma warning (disable: 26812)
50
#endif
51
52
53
#if defined (__clang__)
54
#if __has_warning("-Wunknown-warning-option")
55
#pragma clang diagnostic ignored "-Wunknown-warning-option"
56
#endif
57
#pragma clang diagnostic ignored "-Wunknown-pragmas"
58
#pragma clang diagnostic ignored "-Wold-style-cast"
59
#pragma clang diagnostic ignored "-Wfloat-equal"
60
#pragma clang diagnostic ignored "-Wglobal-constructors"
61
#pragma clang diagnostic ignored "-Wsign-conversion"
62
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
63
#pragma clang diagnostic ignored "-Wcomma"
64
#pragma clang diagnostic ignored "-Wreserved-id-macro"
65
#pragma clang diagnostic ignored "-Wdouble-promotion"
66
#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion"
67
#pragma clang diagnostic ignored "-Wreserved-identifier"
68
#pragma clang diagnostic ignored "-Wunsafe-buffer-usage"
69
#pragma clang diagnostic ignored "-Wnontrivial-memaccess"
70
#elif defined (__GNUC__)
71
#pragma GCC diagnostic ignored "-Wpragmas"
72
#pragma GCC diagnostic ignored "-Wunused-function"
73
#pragma GCC diagnostic ignored "-Wdouble-promotion"
74
#pragma GCC diagnostic ignored "-Wconversion"
75
#pragma GCC diagnostic ignored "-Wstack-protector"
76
#pragma GCC diagnostic ignored "-Wclass-memaccess"
77
#endif
78
79
80
81
82
83
84
85
86
87
88
89
90
#ifdef IMGUI_STB_NAMESPACE
91
namespace IMGUI_STB_NAMESPACE
92
{
93
#endif
94
95
#ifdef _MSC_VER
96
#pragma warning (push)
97
#pragma warning (disable: 4456)
98
#pragma warning (disable: 6011)
99
#pragma warning (disable: 6385)
100
#pragma warning (disable: 28182)
101
#endif
102
103
#if defined (__clang__)
104
#pragma clang diagnostic push
105
#pragma clang diagnostic ignored "-Wunused-function"
106
#pragma clang diagnostic ignored "-Wmissing-prototypes"
107
#pragma clang diagnostic ignored "-Wimplicit-fallthrough"
108
#pragma clang diagnostic ignored "-Wcast-qual"
109
#endif
110
111
#if defined (__GNUC__)
112
#pragma GCC diagnostic push
113
#pragma GCC diagnostic ignored "-Wtype-limits"
114
#pragma GCC diagnostic ignored "-Wcast-qual"
115
#endif
116
117
#ifndef STB_RECT_PACK_IMPLEMENTATION
118
#ifndef IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION
119
#define STBRP_STATIC
120
#define STBRP_ASSERT ( x ) do { IM_ASSERT ( x ) ; } while ( 0 )
121
#define STBRP_SORT ImQsort
122
#define STB_RECT_PACK_IMPLEMENTATION
123
#endif
124
#ifdef IMGUI_STB_RECT_PACK_FILENAME
125
#include IMGUI_STB_RECT_PACK_FILENAME
126
#else
127
#include " imstb_rectpack.h"
128
#endif
129
#endif
130
131
#ifdef IMGUI_ENABLE_STB_TRUETYPE
132
#ifndef STB_TRUETYPE_IMPLEMENTATION
133
#ifndef IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION
134
#define STBTT_malloc ( x , u ) ( ( void ) ( u) , IM_ALLOC ( x ) )
135
#define STBTT_free ( x , u ) ( ( void ) ( u) , IM_FREE ( x ) )
136
#define STBTT_assert ( x ) do { IM_ASSERT ( x ) ; } while ( 0 )
137
#define STBTT_fmod ( x , y ) ImFmod ( x, y )
138
#define STBTT_sqrt ( x ) ImSqrt ( x )
139
#define STBTT_pow ( x , y ) ImPow ( x, y )
140
#define STBTT_fabs ( x ) ImFabs ( x )
141
#define STBTT_ifloor ( x ) ( ( int ) ImFloor ( x ) )
142
#define STBTT_iceil ( x ) ( ( int ) ImCeil ( x ) )
143
#define STBTT_STATIC
144
#define STB_TRUETYPE_IMPLEMENTATION
145
#else
146
#define STBTT_DEF extern
147
#endif
148
#ifdef IMGUI_STB_TRUETYPE_FILENAME
149
#include IMGUI_STB_TRUETYPE_FILENAME
150
#else
151
#include " imstb_truetype.h"
152
#endif
153
#endif
154
#endif
155
156
#if defined (__GNUC__)
157
#pragma GCC diagnostic pop
158
#endif
159
160
#if defined (__clang__)
161
#pragma clang diagnostic pop
162
#endif
163
164
#if defined (_MSC_VER)
165
#pragma warning (pop)
166
#endif
167
168
#ifdef IMGUI_STB_NAMESPACE
169
}
170
using namespace IMGUI_STB_NAMESPACE;
171
#endif
172
173
174
175
176
177
void ImGui:: StyleColorsDark ( ImGuiStyle* dst )
178
{
179
ImGuiStyle* style = dst ? dst : & ImGui:: GetStyle ( ) ;
180
ImVec4* colors = style-> Colors ;
181
182
colors[ ImGuiCol_Text] = ImVec4 ( 1.00f , 1.00f , 1.00f , 1.00f ) ;
183
colors[ ImGuiCol_TextDisabled] = ImVec4 ( 0.50f , 0.50f , 0.50f , 1.00f ) ;
184
colors[ ImGuiCol_WindowBg] = ImVec4 ( 0.06f , 0.06f , 0.06f , 0.94f ) ;
185
colors[ ImGuiCol_ChildBg] = ImVec4 ( 0.00f , 0.00f , 0.00f , 0.00f ) ;
186
colors[ ImGuiCol_PopupBg] = ImVec4 ( 0.08f , 0.08f , 0.08f , 0.94f ) ;
187
colors[ ImGuiCol_Border] = ImVec4 ( 0.43f , 0.43f , 0.50f , 0.50f ) ;
188
colors[ ImGuiCol_BorderShadow] = ImVec4 ( 0.00f , 0.00f , 0.00f , 0.00f ) ;
189
colors[ ImGuiCol_FrameBg] = ImVec4 ( 0.16f , 0.29f , 0.48f , 0.54f ) ;
190
colors[ ImGuiCol_FrameBgHovered] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.40f ) ;
191
colors[ ImGuiCol_FrameBgActive] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.67f ) ;
192
colors[ ImGuiCol_TitleBg] = ImVec4 ( 0.04f , 0.04f , 0.04f , 1.00f ) ;
193
colors[ ImGuiCol_TitleBgActive] = ImVec4 ( 0.16f , 0.29f , 0.48f , 1.00f ) ;
194
colors[ ImGuiCol_TitleBgCollapsed] = ImVec4 ( 0.00f , 0.00f , 0.00f , 0.51f ) ;
195
colors[ ImGuiCol_MenuBarBg] = ImVec4 ( 0.14f , 0.14f , 0.14f , 1.00f ) ;
196
colors[ ImGuiCol_ScrollbarBg] = ImVec4 ( 0.02f , 0.02f , 0.02f , 0.53f ) ;
197
colors[ ImGuiCol_ScrollbarGrab] = ImVec4 ( 0.31f , 0.31f , 0.31f , 1.00f ) ;
198
colors[ ImGuiCol_ScrollbarGrabHovered] = ImVec4 ( 0.41f , 0.41f , 0.41f , 1.00f ) ;
199
colors[ ImGuiCol_ScrollbarGrabActive] = ImVec4 ( 0.51f , 0.51f , 0.51f , 1.00f ) ;
200
colors[ ImGuiCol_CheckMark] = ImVec4 ( 0.26f , 0.59f , 0.98f , 1.00f ) ;
201
colors[ ImGuiCol_SliderGrab] = ImVec4 ( 0.24f , 0.52f , 0.88f , 1.00f ) ;
202
colors[ ImGuiCol_SliderGrabActive] = ImVec4 ( 0.26f , 0.59f , 0.98f , 1.00f ) ;
203
colors[ ImGuiCol_Button] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.40f ) ;
204
colors[ ImGuiCol_ButtonHovered] = ImVec4 ( 0.26f , 0.59f , 0.98f , 1.00f ) ;
205
colors[ ImGuiCol_ButtonActive] = ImVec4 ( 0.06f , 0.53f , 0.98f , 1.00f ) ;
206
colors[ ImGuiCol_Header] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.31f ) ;
207
colors[ ImGuiCol_HeaderHovered] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.80f ) ;
208
colors[ ImGuiCol_HeaderActive] = ImVec4 ( 0.26f , 0.59f , 0.98f , 1.00f ) ;
209
colors[ ImGuiCol_Separator] = colors[ ImGuiCol_Border] ;
210
colors[ ImGuiCol_SeparatorHovered] = ImVec4 ( 0.10f , 0.40f , 0.75f , 0.78f ) ;
211
colors[ ImGuiCol_SeparatorActive] = ImVec4 ( 0.10f , 0.40f , 0.75f , 1.00f ) ;
212
colors[ ImGuiCol_ResizeGrip] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.20f ) ;
213
colors[ ImGuiCol_ResizeGripHovered] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.67f ) ;
214
colors[ ImGuiCol_ResizeGripActive] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.95f ) ;
215
colors[ ImGuiCol_TabHovered] = colors[ ImGuiCol_HeaderHovered] ;
216
colors[ ImGuiCol_Tab] = ImLerp ( colors[ ImGuiCol_Header] , colors[ ImGuiCol_TitleBgActive] , 0.80f ) ;
217
colors[ ImGuiCol_TabSelected] = ImLerp ( colors[ ImGuiCol_HeaderActive] , colors[ ImGuiCol_TitleBgActive] , 0.60f ) ;
218
colors[ ImGuiCol_TabSelectedOverline] = colors[ ImGuiCol_HeaderActive] ;
219
colors[ ImGuiCol_TabDimmed] = ImLerp ( colors[ ImGuiCol_Tab] , colors[ ImGuiCol_TitleBg] , 0.80f ) ;
220
colors[ ImGuiCol_TabDimmedSelected] = ImLerp ( colors[ ImGuiCol_TabSelected] , colors[ ImGuiCol_TitleBg] , 0.40f ) ;
221
colors[ ImGuiCol_TabDimmedSelectedOverline] = ImVec4 ( 0.50f , 0.50f , 0.50f , 0.00f ) ;
222
colors[ ImGuiCol_DockingPreview] = colors[ ImGuiCol_HeaderActive] * ImVec4 ( 1.0f , 1.0f , 1.0f , 0.7f ) ;
223
colors[ ImGuiCol_DockingEmptyBg] = ImVec4 ( 0.20f , 0.20f , 0.20f , 1.00f ) ;
224
colors[ ImGuiCol_PlotLines] = ImVec4 ( 0.61f , 0.61f , 0.61f , 1.00f ) ;
225
colors[ ImGuiCol_PlotLinesHovered] = ImVec4 ( 1.00f , 0.43f , 0.35f , 1.00f ) ;
226
colors[ ImGuiCol_PlotHistogram] = ImVec4 ( 0.90f , 0.70f , 0.00f , 1.00f ) ;
227
colors[ ImGuiCol_PlotHistogramHovered] = ImVec4 ( 1.00f , 0.60f , 0.00f , 1.00f ) ;
228
colors[ ImGuiCol_TableHeaderBg] = ImVec4 ( 0.19f , 0.19f , 0.20f , 1.00f ) ;
229
colors[ ImGuiCol_TableBorderStrong] = ImVec4 ( 0.31f , 0.31f , 0.35f , 1.00f ) ;
230
colors[ ImGuiCol_TableBorderLight] = ImVec4 ( 0.23f , 0.23f , 0.25f , 1.00f ) ;
231
colors[ ImGuiCol_TableRowBg] = ImVec4 ( 0.00f , 0.00f , 0.00f , 0.00f ) ;
232
colors[ ImGuiCol_TableRowBgAlt] = ImVec4 ( 1.00f , 1.00f , 1.00f , 0.06f ) ;
233
colors[ ImGuiCol_TextLink] = colors[ ImGuiCol_HeaderActive] ;
234
colors[ ImGuiCol_TextSelectedBg] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.35f ) ;
235
colors[ ImGuiCol_DragDropTarget] = ImVec4 ( 1.00f , 1.00f , 0.00f , 0.90f ) ;
236
colors[ ImGuiCol_NavCursor] = ImVec4 ( 0.26f , 0.59f , 0.98f , 1.00f ) ;
237
colors[ ImGuiCol_NavWindowingHighlight] = ImVec4 ( 1.00f , 1.00f , 1.00f , 0.70f ) ;
238
colors[ ImGuiCol_NavWindowingDimBg] = ImVec4 ( 0.80f , 0.80f , 0.80f , 0.20f ) ;
239
colors[ ImGuiCol_ModalWindowDimBg] = ImVec4 ( 0.80f , 0.80f , 0.80f , 0.35f ) ;
240
}
241
242
void ImGui:: StyleColorsClassic ( ImGuiStyle* dst )
243
{
244
ImGuiStyle* style = dst ? dst : & ImGui:: GetStyle ( ) ;
245
ImVec4* colors = style-> Colors ;
246
247
colors[ ImGuiCol_Text] = ImVec4 ( 0.90f , 0.90f , 0.90f , 1.00f ) ;
248
colors[ ImGuiCol_TextDisabled] = ImVec4 ( 0.60f , 0.60f , 0.60f , 1.00f ) ;
249
colors[ ImGuiCol_WindowBg] = ImVec4 ( 0.00f , 0.00f , 0.00f , 0.85f ) ;
250
colors[ ImGuiCol_ChildBg] = ImVec4 ( 0.00f , 0.00f , 0.00f , 0.00f ) ;
251
colors[ ImGuiCol_PopupBg] = ImVec4 ( 0.11f , 0.11f , 0.14f , 0.92f ) ;
252
colors[ ImGuiCol_Border] = ImVec4 ( 0.50f , 0.50f , 0.50f , 0.50f ) ;
253
colors[ ImGuiCol_BorderShadow] = ImVec4 ( 0.00f , 0.00f , 0.00f , 0.00f ) ;
254
colors[ ImGuiCol_FrameBg] = ImVec4 ( 0.43f , 0.43f , 0.43f , 0.39f ) ;
255
colors[ ImGuiCol_FrameBgHovered] = ImVec4 ( 0.47f , 0.47f , 0.69f , 0.40f ) ;
256
colors[ ImGuiCol_FrameBgActive] = ImVec4 ( 0.42f , 0.41f , 0.64f , 0.69f ) ;
257
colors[ ImGuiCol_TitleBg] = ImVec4 ( 0.27f , 0.27f , 0.54f , 0.83f ) ;
258
colors[ ImGuiCol_TitleBgActive] = ImVec4 ( 0.32f , 0.32f , 0.63f , 0.87f ) ;
259
colors[ ImGuiCol_TitleBgCollapsed] = ImVec4 ( 0.40f , 0.40f , 0.80f , 0.20f ) ;
260
colors[ ImGuiCol_MenuBarBg] = ImVec4 ( 0.40f , 0.40f , 0.55f , 0.80f ) ;
261
colors[ ImGuiCol_ScrollbarBg] = ImVec4 ( 0.20f , 0.25f , 0.30f , 0.60f ) ;
262
colors[ ImGuiCol_ScrollbarGrab] = ImVec4 ( 0.40f , 0.40f , 0.80f , 0.30f ) ;
263
colors[ ImGuiCol_ScrollbarGrabHovered] = ImVec4 ( 0.40f , 0.40f , 0.80f , 0.40f ) ;
264
colors[ ImGuiCol_ScrollbarGrabActive] = ImVec4 ( 0.41f , 0.39f , 0.80f , 0.60f ) ;
265
colors[ ImGuiCol_CheckMark] = ImVec4 ( 0.90f , 0.90f , 0.90f , 0.50f ) ;
266
colors[ ImGuiCol_SliderGrab] = ImVec4 ( 1.00f , 1.00f , 1.00f , 0.30f ) ;
267
colors[ ImGuiCol_SliderGrabActive] = ImVec4 ( 0.41f , 0.39f , 0.80f , 0.60f ) ;
268
colors[ ImGuiCol_Button] = ImVec4 ( 0.35f , 0.40f , 0.61f , 0.62f ) ;
269
colors[ ImGuiCol_ButtonHovered] = ImVec4 ( 0.40f , 0.48f , 0.71f , 0.79f ) ;
270
colors[ ImGuiCol_ButtonActive] = ImVec4 ( 0.46f , 0.54f , 0.80f , 1.00f ) ;
271
colors[ ImGuiCol_Header] = ImVec4 ( 0.40f , 0.40f , 0.90f , 0.45f ) ;
272
colors[ ImGuiCol_HeaderHovered] = ImVec4 ( 0.45f , 0.45f , 0.90f , 0.80f ) ;
273
colors[ ImGuiCol_HeaderActive] = ImVec4 ( 0.53f , 0.53f , 0.87f , 0.80f ) ;
274
colors[ ImGuiCol_Separator] = ImVec4 ( 0.50f , 0.50f , 0.50f , 0.60f ) ;
275
colors[ ImGuiCol_SeparatorHovered] = ImVec4 ( 0.60f , 0.60f , 0.70f , 1.00f ) ;
276
colors[ ImGuiCol_SeparatorActive] = ImVec4 ( 0.70f , 0.70f , 0.90f , 1.00f ) ;
277
colors[ ImGuiCol_ResizeGrip] = ImVec4 ( 1.00f , 1.00f , 1.00f , 0.10f ) ;
278
colors[ ImGuiCol_ResizeGripHovered] = ImVec4 ( 0.78f , 0.82f , 1.00f , 0.60f ) ;
279
colors[ ImGuiCol_ResizeGripActive] = ImVec4 ( 0.78f , 0.82f , 1.00f , 0.90f ) ;
280
colors[ ImGuiCol_TabHovered] = colors[ ImGuiCol_HeaderHovered] ;
281
colors[ ImGuiCol_Tab] = ImLerp ( colors[ ImGuiCol_Header] , colors[ ImGuiCol_TitleBgActive] , 0.80f ) ;
282
colors[ ImGuiCol_TabSelected] = ImLerp ( colors[ ImGuiCol_HeaderActive] , colors[ ImGuiCol_TitleBgActive] , 0.60f ) ;
283
colors[ ImGuiCol_TabSelectedOverline] = colors[ ImGuiCol_HeaderActive] ;
284
colors[ ImGuiCol_TabDimmed] = ImLerp ( colors[ ImGuiCol_Tab] , colors[ ImGuiCol_TitleBg] , 0.80f ) ;
285
colors[ ImGuiCol_TabDimmedSelected] = ImLerp ( colors[ ImGuiCol_TabSelected] , colors[ ImGuiCol_TitleBg] , 0.40f ) ;
286
colors[ ImGuiCol_TabDimmedSelectedOverline] = ImVec4 ( 0.53f , 0.53f , 0.87f , 0.00f ) ;
287
colors[ ImGuiCol_DockingPreview] = colors[ ImGuiCol_Header] * ImVec4 ( 1.0f , 1.0f , 1.0f , 0.7f ) ;
288
colors[ ImGuiCol_DockingEmptyBg] = ImVec4 ( 0.20f , 0.20f , 0.20f , 1.00f ) ;
289
colors[ ImGuiCol_PlotLines] = ImVec4 ( 1.00f , 1.00f , 1.00f , 1.00f ) ;
290
colors[ ImGuiCol_PlotLinesHovered] = ImVec4 ( 0.90f , 0.70f , 0.00f , 1.00f ) ;
291
colors[ ImGuiCol_PlotHistogram] = ImVec4 ( 0.90f , 0.70f , 0.00f , 1.00f ) ;
292
colors[ ImGuiCol_PlotHistogramHovered] = ImVec4 ( 1.00f , 0.60f , 0.00f , 1.00f ) ;
293
colors[ ImGuiCol_TableHeaderBg] = ImVec4 ( 0.27f , 0.27f , 0.38f , 1.00f ) ;
294
colors[ ImGuiCol_TableBorderStrong] = ImVec4 ( 0.31f , 0.31f , 0.45f , 1.00f ) ;
295
colors[ ImGuiCol_TableBorderLight] = ImVec4 ( 0.26f , 0.26f , 0.28f , 1.00f ) ;
296
colors[ ImGuiCol_TableRowBg] = ImVec4 ( 0.00f , 0.00f , 0.00f , 0.00f ) ;
297
colors[ ImGuiCol_TableRowBgAlt] = ImVec4 ( 1.00f , 1.00f , 1.00f , 0.07f ) ;
298
colors[ ImGuiCol_TextLink] = colors[ ImGuiCol_HeaderActive] ;
299
colors[ ImGuiCol_TextSelectedBg] = ImVec4 ( 0.00f , 0.00f , 1.00f , 0.35f ) ;
300
colors[ ImGuiCol_DragDropTarget] = ImVec4 ( 1.00f , 1.00f , 0.00f , 0.90f ) ;
301
colors[ ImGuiCol_NavCursor] = colors[ ImGuiCol_HeaderHovered] ;
302
colors[ ImGuiCol_NavWindowingHighlight] = ImVec4 ( 1.00f , 1.00f , 1.00f , 0.70f ) ;
303
colors[ ImGuiCol_NavWindowingDimBg] = ImVec4 ( 0.80f , 0.80f , 0.80f , 0.20f ) ;
304
colors[ ImGuiCol_ModalWindowDimBg] = ImVec4 ( 0.20f , 0.20f , 0.20f , 0.35f ) ;
305
}
306
307
308
void ImGui:: StyleColorsLight ( ImGuiStyle* dst )
309
{
310
ImGuiStyle* style = dst ? dst : & ImGui:: GetStyle ( ) ;
311
ImVec4* colors = style-> Colors ;
312
313
colors[ ImGuiCol_Text] = ImVec4 ( 0.00f , 0.00f , 0.00f , 1.00f ) ;
314
colors[ ImGuiCol_TextDisabled] = ImVec4 ( 0.60f , 0.60f , 0.60f , 1.00f ) ;
315
colors[ ImGuiCol_WindowBg] = ImVec4 ( 0.94f , 0.94f , 0.94f , 1.00f ) ;
316
colors[ ImGuiCol_ChildBg] = ImVec4 ( 0.00f , 0.00f , 0.00f , 0.00f ) ;
317
colors[ ImGuiCol_PopupBg] = ImVec4 ( 1.00f , 1.00f , 1.00f , 0.98f ) ;
318
colors[ ImGuiCol_Border] = ImVec4 ( 0.00f , 0.00f , 0.00f , 0.30f ) ;
319
colors[ ImGuiCol_BorderShadow] = ImVec4 ( 0.00f , 0.00f , 0.00f , 0.00f ) ;
320
colors[ ImGuiCol_FrameBg] = ImVec4 ( 1.00f , 1.00f , 1.00f , 1.00f ) ;
321
colors[ ImGuiCol_FrameBgHovered] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.40f ) ;
322
colors[ ImGuiCol_FrameBgActive] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.67f ) ;
323
colors[ ImGuiCol_TitleBg] = ImVec4 ( 0.96f , 0.96f , 0.96f , 1.00f ) ;
324
colors[ ImGuiCol_TitleBgActive] = ImVec4 ( 0.82f , 0.82f , 0.82f , 1.00f ) ;
325
colors[ ImGuiCol_TitleBgCollapsed] = ImVec4 ( 1.00f , 1.00f , 1.00f , 0.51f ) ;
326
colors[ ImGuiCol_MenuBarBg] = ImVec4 ( 0.86f , 0.86f , 0.86f , 1.00f ) ;
327
colors[ ImGuiCol_ScrollbarBg] = ImVec4 ( 0.98f , 0.98f , 0.98f , 0.53f ) ;
328
colors[ ImGuiCol_ScrollbarGrab] = ImVec4 ( 0.69f , 0.69f , 0.69f , 0.80f ) ;
329
colors[ ImGuiCol_ScrollbarGrabHovered] = ImVec4 ( 0.49f , 0.49f , 0.49f , 0.80f ) ;
330
colors[ ImGuiCol_ScrollbarGrabActive] = ImVec4 ( 0.49f , 0.49f , 0.49f , 1.00f ) ;
331
colors[ ImGuiCol_CheckMark] = ImVec4 ( 0.26f , 0.59f , 0.98f , 1.00f ) ;
332
colors[ ImGuiCol_SliderGrab] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.78f ) ;
333
colors[ ImGuiCol_SliderGrabActive] = ImVec4 ( 0.46f , 0.54f , 0.80f , 0.60f ) ;
334
colors[ ImGuiCol_Button] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.40f ) ;
335
colors[ ImGuiCol_ButtonHovered] = ImVec4 ( 0.26f , 0.59f , 0.98f , 1.00f ) ;
336
colors[ ImGuiCol_ButtonActive] = ImVec4 ( 0.06f , 0.53f , 0.98f , 1.00f ) ;
337
colors[ ImGuiCol_Header] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.31f ) ;
338
colors[ ImGuiCol_HeaderHovered] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.80f ) ;
339
colors[ ImGuiCol_HeaderActive] = ImVec4 ( 0.26f , 0.59f , 0.98f , 1.00f ) ;
340
colors[ ImGuiCol_Separator] = ImVec4 ( 0.39f , 0.39f , 0.39f , 0.62f ) ;
341
colors[ ImGuiCol_SeparatorHovered] = ImVec4 ( 0.14f , 0.44f , 0.80f , 0.78f ) ;
342
colors[ ImGuiCol_SeparatorActive] = ImVec4 ( 0.14f , 0.44f , 0.80f , 1.00f ) ;
343
colors[ ImGuiCol_ResizeGrip] = ImVec4 ( 0.35f , 0.35f , 0.35f , 0.17f ) ;
344
colors[ ImGuiCol_ResizeGripHovered] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.67f ) ;
345
colors[ ImGuiCol_ResizeGripActive] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.95f ) ;
346
colors[ ImGuiCol_TabHovered] = colors[ ImGuiCol_HeaderHovered] ;
347
colors[ ImGuiCol_Tab] = ImLerp ( colors[ ImGuiCol_Header] , colors[ ImGuiCol_TitleBgActive] , 0.90f ) ;
348
colors[ ImGuiCol_TabSelected] = ImLerp ( colors[ ImGuiCol_HeaderActive] , colors[ ImGuiCol_TitleBgActive] , 0.60f ) ;
349
colors[ ImGuiCol_TabSelectedOverline] = colors[ ImGuiCol_HeaderActive] ;
350
colors[ ImGuiCol_TabDimmed] = ImLerp ( colors[ ImGuiCol_Tab] , colors[ ImGuiCol_TitleBg] , 0.80f ) ;
351
colors[ ImGuiCol_TabDimmedSelected] = ImLerp ( colors[ ImGuiCol_TabSelected] , colors[ ImGuiCol_TitleBg] , 0.40f ) ;
352
colors[ ImGuiCol_TabDimmedSelectedOverline] = ImVec4 ( 0.26f , 0.59f , 1.00f , 0.00f ) ;
353
colors[ ImGuiCol_DockingPreview] = colors[ ImGuiCol_Header] * ImVec4 ( 1.0f , 1.0f , 1.0f , 0.7f ) ;
354
colors[ ImGuiCol_DockingEmptyBg] = ImVec4 ( 0.20f , 0.20f , 0.20f , 1.00f ) ;
355
colors[ ImGuiCol_PlotLines] = ImVec4 ( 0.39f , 0.39f , 0.39f , 1.00f ) ;
356
colors[ ImGuiCol_PlotLinesHovered] = ImVec4 ( 1.00f , 0.43f , 0.35f , 1.00f ) ;
357
colors[ ImGuiCol_PlotHistogram] = ImVec4 ( 0.90f , 0.70f , 0.00f , 1.00f ) ;
358
colors[ ImGuiCol_PlotHistogramHovered] = ImVec4 ( 1.00f , 0.45f , 0.00f , 1.00f ) ;
359
colors[ ImGuiCol_TableHeaderBg] = ImVec4 ( 0.78f , 0.87f , 0.98f , 1.00f ) ;
360
colors[ ImGuiCol_TableBorderStrong] = ImVec4 ( 0.57f , 0.57f , 0.64f , 1.00f ) ;
361
colors[ ImGuiCol_TableBorderLight] = ImVec4 ( 0.68f , 0.68f , 0.74f , 1.00f ) ;
362
colors[ ImGuiCol_TableRowBg] = ImVec4 ( 0.00f , 0.00f , 0.00f , 0.00f ) ;
363
colors[ ImGuiCol_TableRowBgAlt] = ImVec4 ( 0.30f , 0.30f , 0.30f , 0.09f ) ;
364
colors[ ImGuiCol_TextLink] = colors[ ImGuiCol_HeaderActive] ;
365
colors[ ImGuiCol_TextSelectedBg] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.35f ) ;
366
colors[ ImGuiCol_DragDropTarget] = ImVec4 ( 0.26f , 0.59f , 0.98f , 0.95f ) ;
367
colors[ ImGuiCol_NavCursor] = colors[ ImGuiCol_HeaderHovered] ;
368
colors[ ImGuiCol_NavWindowingHighlight] = ImVec4 ( 0.70f , 0.70f , 0.70f , 0.70f ) ;
369
colors[ ImGuiCol_NavWindowingDimBg] = ImVec4 ( 0.20f , 0.20f , 0.20f , 0.20f ) ;
370
colors[ ImGuiCol_ModalWindowDimBg] = ImVec4 ( 0.20f , 0.20f , 0.20f , 0.35f ) ;
371
}
372
373
374
375
376
377
ImDrawListSharedData:: ImDrawListSharedData ( )
378
{
379
memset ( this , 0 , sizeof ( * this ) ) ;
380
for ( int i = 0 ; i < IM_ARRAYSIZE ( ArcFastVtx ) ; i+ + )
381
{
382
const float a = ( ( float ) i * 2 * IM_PI) / ( float ) IM_ARRAYSIZE ( ArcFastVtx ) ;
383
ArcFastVtx[ i] = ImVec2 ( ImCos ( a ) , ImSin ( a ) ) ;
384
}
385
ArcFastRadiusCutoff = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R ( IM_DRAWLIST_ARCFAST_SAMPLE_MAX, CircleSegmentMaxError ) ;
386
}
387
388
void ImDrawListSharedData:: SetCircleTessellationMaxError ( float max_error )
389
{
390
if ( CircleSegmentMaxError == max_error)
391
return ;
392
393
IM_ASSERT ( max_error > 0.0f ) ;
394
CircleSegmentMaxError = max_error;
395
for ( int i = 0 ; i < IM_ARRAYSIZE ( CircleSegmentCounts ) ; i+ + )
396
{
397
const float radius = ( float ) i;
398
CircleSegmentCounts[ i] = ( ImU8) ( ( i > 0 ) ? IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC ( radius, CircleSegmentMaxError ) : IM_DRAWLIST_ARCFAST_SAMPLE_MAX) ;
399
}
400
ArcFastRadiusCutoff = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R ( IM_DRAWLIST_ARCFAST_SAMPLE_MAX, CircleSegmentMaxError ) ;
401
}
402
403
404
405
void ImDrawList:: _ResetForNewFrame ( )
406
{
407
408
IM_STATIC_ASSERT ( offsetof ( ImDrawCmd, ClipRect ) == 0 ) ;
409
IM_STATIC_ASSERT ( offsetof ( ImDrawCmd, TextureId ) == sizeof ( ImVec4 ) ) ;
410
IM_STATIC_ASSERT ( offsetof ( ImDrawCmd, VtxOffset ) == sizeof ( ImVec4 ) + sizeof ( ImTextureID ) ) ;
411
if ( _Splitter. _Count > 1 )
412
_Splitter. Merge ( this ) ;
413
414
CmdBuffer. resize ( 0 ) ;
415
IdxBuffer. resize ( 0 ) ;
416
VtxBuffer. resize ( 0 ) ;
417
Flags = _Data-> InitialFlags ;
418
memset ( & _CmdHeader, 0 , sizeof ( _CmdHeader ) ) ;
419
_VtxCurrentIdx = 0 ;
420
_VtxWritePtr = NULL ;
421
_IdxWritePtr = NULL ;
422
_ClipRectStack. resize ( 0 ) ;
423
_TextureIdStack. resize ( 0 ) ;
424
_CallbacksDataBuf. resize ( 0 ) ;
425
_Path. resize ( 0 ) ;
426
_Splitter. Clear ( ) ;
427
CmdBuffer. push_back ( ImDrawCmd ( ) ) ;
428
_FringeScale = 1.0f ;
429
}
430
431
void ImDrawList:: _ClearFreeMemory ( )
432
{
433
CmdBuffer. clear ( ) ;
434
IdxBuffer. clear ( ) ;
435
VtxBuffer. clear ( ) ;
436
Flags = ImDrawListFlags_None;
437
_VtxCurrentIdx = 0 ;
438
_VtxWritePtr = NULL ;
439
_IdxWritePtr = NULL ;
440
_ClipRectStack. clear ( ) ;
441
_TextureIdStack. clear ( ) ;
442
_CallbacksDataBuf. clear ( ) ;
443
_Path. clear ( ) ;
444
_Splitter. ClearFreeMemory ( ) ;
445
}
446
447
ImDrawList* ImDrawList:: CloneOutput ( ) const
448
{
449
ImDrawList* dst = IM_NEW ( ImDrawList ( _Data ) ) ;
450
dst-> CmdBuffer = CmdBuffer;
451
dst-> IdxBuffer = IdxBuffer;
452
dst-> VtxBuffer = VtxBuffer;
453
dst-> Flags = Flags;
454
return dst;
455
}
456
457
void ImDrawList:: AddDrawCmd ( )
458
{
459
ImDrawCmd draw_cmd;
460
draw_cmd. ClipRect = _CmdHeader. ClipRect ;
461
draw_cmd. TextureId = _CmdHeader. TextureId ;
462
draw_cmd. VtxOffset = _CmdHeader. VtxOffset ;
463
draw_cmd. IdxOffset = IdxBuffer. Size ;
464
465
IM_ASSERT ( draw_cmd. ClipRect . x <= draw_cmd. ClipRect . z && draw_cmd. ClipRect . y <= draw_cmd. ClipRect . w ) ;
466
CmdBuffer. push_back ( draw_cmd ) ;
467
}
468
469
470
471
void ImDrawList:: _PopUnusedDrawCmd ( )
472
{
473
while ( CmdBuffer. Size > 0 )
474
{
475
ImDrawCmd* curr_cmd = & CmdBuffer. Data [ CmdBuffer. Size - 1 ] ;
476
if ( curr_cmd-> ElemCount != 0 || curr_cmd-> UserCallback != NULL )
477
return ;
478
CmdBuffer. pop_back ( ) ;
479
}
480
}
481
482
void ImDrawList:: AddCallback ( ImDrawCallback callback , void * userdata , size_t userdata_size )
483
{
484
IM_ASSERT_PARANOID ( CmdBuffer. Size > 0 ) ;
485
ImDrawCmd* curr_cmd = & CmdBuffer. Data [ CmdBuffer. Size - 1 ] ;
486
IM_ASSERT ( curr_cmd-> UserCallback == NULL ) ;
487
if ( curr_cmd-> ElemCount != 0 )
488
{
489
AddDrawCmd ( ) ;
490
curr_cmd = & CmdBuffer. Data [ CmdBuffer. Size - 1 ] ;
491
}
492
493
curr_cmd-> UserCallback = callback;
494
if ( userdata_size == 0 )
495
{
496
497
curr_cmd-> UserCallbackData = userdata;
498
curr_cmd-> UserCallbackDataSize = 0 ;
499
curr_cmd-> UserCallbackDataOffset = - 1 ;
500
}
501
else
502
{
503
504
IM_ASSERT ( userdata != NULL ) ;
505
IM_ASSERT ( userdata_size < ( 1u << 31 ) ) ;
506
curr_cmd-> UserCallbackData = NULL ;
507
curr_cmd-> UserCallbackDataSize = ( int ) userdata_size;
508
curr_cmd-> UserCallbackDataOffset = _CallbacksDataBuf. Size ;
509
_CallbacksDataBuf. resize ( _CallbacksDataBuf. Size + ( int ) userdata_size ) ;
510
memcpy ( _CallbacksDataBuf. Data + ( size_t ) curr_cmd-> UserCallbackDataOffset , userdata, userdata_size ) ;
511
}
512
513
AddDrawCmd ( ) ;
514
}
515
516
517
#define ImDrawCmd_HeaderSize ( offsetof ( ImDrawCmd, VtxOffset ) + sizeof ( unsigned int ) )
518
#define ImDrawCmd_HeaderCompare ( CMD_LHS , CMD_RHS ) ( memcmp ( CMD_LHS, CMD_RHS, ImDrawCmd_HeaderSize ) )
519
#define ImDrawCmd_HeaderCopy ( CMD_DST , CMD_SRC ) ( memcpy ( CMD_DST, CMD_SRC, ImDrawCmd_HeaderSize ) )
520
#define ImDrawCmd_AreSequentialIdxOffset ( CMD_0 , CMD_1 ) ( CMD_0-> IdxOffset + CMD_0-> ElemCount == CMD_1-> IdxOffset )
521
522
523
void ImDrawList:: _TryMergeDrawCmds ( )
524
{
525
IM_ASSERT_PARANOID ( CmdBuffer. Size > 0 ) ;
526
ImDrawCmd* curr_cmd = & CmdBuffer. Data [ CmdBuffer. Size - 1 ] ;
527
ImDrawCmd* prev_cmd = curr_cmd - 1 ;
528
if ( ImDrawCmd_HeaderCompare ( curr_cmd, prev_cmd ) == 0 && ImDrawCmd_AreSequentialIdxOffset ( prev_cmd, curr_cmd ) && curr_cmd-> UserCallback == NULL && prev_cmd-> UserCallback == NULL )
529
{
530
prev_cmd-> ElemCount += curr_cmd-> ElemCount ;
531
CmdBuffer. pop_back ( ) ;
532
}
533
}
534
535
536
537
void ImDrawList:: _OnChangedClipRect ( )
538
{
539
540
IM_ASSERT_PARANOID ( CmdBuffer. Size > 0 ) ;
541
ImDrawCmd* curr_cmd = & CmdBuffer. Data [ CmdBuffer. Size - 1 ] ;
542
if ( curr_cmd-> ElemCount != 0 && memcmp ( & curr_cmd-> ClipRect , & _CmdHeader. ClipRect , sizeof ( ImVec4 ) ) != 0 )
543
{
544
AddDrawCmd ( ) ;
545
return ;
546
}
547
IM_ASSERT ( curr_cmd-> UserCallback == NULL ) ;
548
549
550
ImDrawCmd* prev_cmd = curr_cmd - 1 ;
551
if ( curr_cmd-> ElemCount == 0 && CmdBuffer. Size > 1 && ImDrawCmd_HeaderCompare ( & _CmdHeader, prev_cmd) == 0 && ImDrawCmd_AreSequentialIdxOffset ( prev_cmd, curr_cmd ) && prev_cmd-> UserCallback == NULL )
552
{
553
CmdBuffer. pop_back ( ) ;
554
return ;
555
}
556
curr_cmd-> ClipRect = _CmdHeader. ClipRect ;
557
}
558
559
void ImDrawList:: _OnChangedTextureID ( )
560
{
561
562
IM_ASSERT_PARANOID ( CmdBuffer. Size > 0 ) ;
563
ImDrawCmd* curr_cmd = & CmdBuffer. Data [ CmdBuffer. Size - 1 ] ;
564
if ( curr_cmd-> ElemCount != 0 && curr_cmd-> TextureId != _CmdHeader. TextureId )
565
{
566
AddDrawCmd ( ) ;
567
return ;
568
}
569
IM_ASSERT ( curr_cmd-> UserCallback == NULL ) ;
570
571
572
ImDrawCmd* prev_cmd = curr_cmd - 1 ;
573
if ( curr_cmd-> ElemCount == 0 && CmdBuffer. Size > 1 && ImDrawCmd_HeaderCompare ( & _CmdHeader, prev_cmd) == 0 && ImDrawCmd_AreSequentialIdxOffset ( prev_cmd, curr_cmd ) && prev_cmd-> UserCallback == NULL )
574
{
575
CmdBuffer. pop_back ( ) ;
576
return ;
577
}
578
curr_cmd-> TextureId = _CmdHeader. TextureId ;
579
}
580
581
void ImDrawList:: _OnChangedVtxOffset ( )
582
{
583
584
_VtxCurrentIdx = 0 ;
585
IM_ASSERT_PARANOID ( CmdBuffer. Size > 0 ) ;
586
ImDrawCmd* curr_cmd = & CmdBuffer. Data [ CmdBuffer. Size - 1 ] ;
587
588
if ( curr_cmd-> ElemCount != 0 )
589
{
590
AddDrawCmd ( ) ;
591
return ;
592
}
593
IM_ASSERT ( curr_cmd-> UserCallback == NULL ) ;
594
curr_cmd-> VtxOffset = _CmdHeader. VtxOffset ;
595
}
596
597
int ImDrawList:: _CalcCircleAutoSegmentCount ( float radius ) const
598
{
599
600
const int radius_idx = ( int ) ( radius + 0.999999f ) ;
601
if ( radius_idx >= 0 && radius_idx < IM_ARRAYSIZE ( _Data-> CircleSegmentCounts ) )
602
return _Data-> CircleSegmentCounts [ radius_idx] ;
603
else
604
return IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC ( radius, _Data-> CircleSegmentMaxError ) ;
605
}
606
607
608
void ImDrawList:: PushClipRect ( const ImVec2& cr_min , const ImVec2& cr_max , bool intersect_with_current_clip_rect )
609
{
610
ImVec4 cr ( cr_min. x , cr_min. y , cr_max. x , cr_max. y ) ;
611
if ( intersect_with_current_clip_rect)
612
{
613
ImVec4 current = _CmdHeader. ClipRect ;
614
if ( cr. x < current. x ) cr. x = current. x ;
615
if ( cr. y < current. y ) cr. y = current. y ;
616
if ( cr. z > current. z ) cr. z = current. z ;
617
if ( cr. w > current. w ) cr. w = current. w ;
618
}
619
cr. z = ImMax ( cr. x , cr. z ) ;
620
cr. w = ImMax ( cr. y , cr. w ) ;
621
622
_ClipRectStack. push_back ( cr ) ;
623
_CmdHeader. ClipRect = cr;
624
_OnChangedClipRect ( ) ;
625
}
626
627
void ImDrawList:: PushClipRectFullScreen ( )
628
{
629
PushClipRect ( ImVec2 ( _Data-> ClipRectFullscreen . x , _Data-> ClipRectFullscreen . y ) , ImVec2 ( _Data-> ClipRectFullscreen . z , _Data-> ClipRectFullscreen . w ) ) ;
630
}
631
632
void ImDrawList:: PopClipRect ( )
633
{
634
_ClipRectStack. pop_back ( ) ;
635
_CmdHeader. ClipRect = ( _ClipRectStack. Size == 0 ) ? _Data-> ClipRectFullscreen : _ClipRectStack. Data [ _ClipRectStack. Size - 1 ] ;
636
_OnChangedClipRect ( ) ;
637
}
638
639
void ImDrawList:: PushTextureID ( ImTextureID texture_id )
640
{
641
_TextureIdStack. push_back ( texture_id ) ;
642
_CmdHeader. TextureId = texture_id;
643
_OnChangedTextureID ( ) ;
644
}
645
646
void ImDrawList:: PopTextureID ( )
647
{
648
_TextureIdStack. pop_back ( ) ;
649
_CmdHeader. TextureId = ( _TextureIdStack. Size == 0 ) ? ( ImTextureID) NULL : _TextureIdStack. Data [ _TextureIdStack. Size - 1 ] ;
650
_OnChangedTextureID ( ) ;
651
}
652
653
654
void ImDrawList:: _SetTextureID ( ImTextureID texture_id )
655
{
656
if ( _CmdHeader. TextureId == texture_id)
657
return ;
658
_CmdHeader. TextureId = texture_id;
659
_OnChangedTextureID ( ) ;
660
}
661
662
663
664
665
void ImDrawList:: PrimReserve ( int idx_count , int vtx_count )
666
{
667
668
IM_ASSERT_PARANOID ( idx_count >= 0 && vtx_count >= 0 ) ;
669
if ( sizeof ( ImDrawIdx ) == 2 && ( _VtxCurrentIdx + vtx_count >= ( 1 << 16 ) ) && ( Flags & ImDrawListFlags_AllowVtxOffset) )
670
{
671
672
673
674
_CmdHeader. VtxOffset = VtxBuffer. Size ;
675
_OnChangedVtxOffset ( ) ;
676
}
677
678
ImDrawCmd* draw_cmd = & CmdBuffer. Data [ CmdBuffer. Size - 1 ] ;
679
draw_cmd-> ElemCount += idx_count;
680
681
int vtx_buffer_old_size = VtxBuffer. Size ;
682
VtxBuffer. resize ( vtx_buffer_old_size + vtx_count ) ;
683
_VtxWritePtr = VtxBuffer. Data + vtx_buffer_old_size;
684
685
int idx_buffer_old_size = IdxBuffer. Size ;
686
IdxBuffer. resize ( idx_buffer_old_size + idx_count ) ;
687
_IdxWritePtr = IdxBuffer. Data + idx_buffer_old_size;
688
}
689
690
691
void ImDrawList:: PrimUnreserve ( int idx_count , int vtx_count )
692
{
693
IM_ASSERT_PARANOID ( idx_count >= 0 && vtx_count >= 0 ) ;
694
695
ImDrawCmd* draw_cmd = & CmdBuffer. Data [ CmdBuffer. Size - 1 ] ;
696
draw_cmd-> ElemCount -= idx_count;
697
VtxBuffer. shrink ( VtxBuffer. Size - vtx_count ) ;
698
IdxBuffer. shrink ( IdxBuffer. Size - idx_count ) ;
699
}
700
701
702
void ImDrawList:: PrimRect ( const ImVec2& a , const ImVec2& c , ImU32 col )
703
{
704
ImVec2 b ( c. x , a. y ) , d ( a. x , c. y ) , uv ( _Data-> TexUvWhitePixel ) ;
705
ImDrawIdx idx = ( ImDrawIdx) _VtxCurrentIdx;
706
_IdxWritePtr[ 0 ] = idx; _IdxWritePtr[ 1 ] = ( ImDrawIdx) ( idx+ 1 ) ; _IdxWritePtr[ 2 ] = ( ImDrawIdx) ( idx+ 2 ) ;
707
_IdxWritePtr[ 3 ] = idx; _IdxWritePtr[ 4 ] = ( ImDrawIdx) ( idx+ 2 ) ; _IdxWritePtr[ 5 ] = ( ImDrawIdx) ( idx+ 3 ) ;
708
_VtxWritePtr[ 0 ] . pos = a; _VtxWritePtr[ 0 ] . uv = uv; _VtxWritePtr[ 0 ] . col = col;
709
_VtxWritePtr[ 1 ] . pos = b; _VtxWritePtr[ 1 ] . uv = uv; _VtxWritePtr[ 1 ] . col = col;
710
_VtxWritePtr[ 2 ] . pos = c; _VtxWritePtr[ 2 ] . uv = uv; _VtxWritePtr[ 2 ] . col = col;
711
_VtxWritePtr[ 3 ] . pos = d; _VtxWritePtr[ 3 ] . uv = uv; _VtxWritePtr[ 3 ] . col = col;
712
_VtxWritePtr += 4 ;
713
_VtxCurrentIdx += 4 ;
714
_IdxWritePtr += 6 ;
715
}
716
717
void ImDrawList:: PrimRectUV ( const ImVec2& a , const ImVec2& c , const ImVec2& uv_a , const ImVec2& uv_c , ImU32 col )
718
{
719
ImVec2 b ( c. x , a. y ) , d ( a. x , c. y ) , uv_b ( uv_c. x , uv_a. y ) , uv_d ( uv_a. x , uv_c. y ) ;
720
ImDrawIdx idx = ( ImDrawIdx) _VtxCurrentIdx;
721
_IdxWritePtr[ 0 ] = idx; _IdxWritePtr[ 1 ] = ( ImDrawIdx) ( idx+ 1 ) ; _IdxWritePtr[ 2 ] = ( ImDrawIdx) ( idx+ 2 ) ;
722
_IdxWritePtr[ 3 ] = idx; _IdxWritePtr[ 4 ] = ( ImDrawIdx) ( idx+ 2 ) ; _IdxWritePtr[ 5 ] = ( ImDrawIdx) ( idx+ 3 ) ;
723
_VtxWritePtr[ 0 ] . pos = a; _VtxWritePtr[ 0 ] . uv = uv_a; _VtxWritePtr[ 0 ] . col = col;
724
_VtxWritePtr[ 1 ] . pos = b; _VtxWritePtr[ 1 ] . uv = uv_b; _VtxWritePtr[ 1 ] . col = col;
725
_VtxWritePtr[ 2 ] . pos = c; _VtxWritePtr[ 2 ] . uv = uv_c; _VtxWritePtr[ 2 ] . col = col;
726
_VtxWritePtr[ 3 ] . pos = d; _VtxWritePtr[ 3 ] . uv = uv_d; _VtxWritePtr[ 3 ] . col = col;
727
_VtxWritePtr += 4 ;
728
_VtxCurrentIdx += 4 ;
729
_IdxWritePtr += 6 ;
730
}
731
732
void ImDrawList:: PrimQuadUV ( const ImVec2& a , const ImVec2& b , const ImVec2& c , const ImVec2& d , const ImVec2& uv_a , const ImVec2& uv_b , const ImVec2& uv_c , const ImVec2& uv_d , ImU32 col )
733
{
734
ImDrawIdx idx = ( ImDrawIdx) _VtxCurrentIdx;
735
_IdxWritePtr[ 0 ] = idx; _IdxWritePtr[ 1 ] = ( ImDrawIdx) ( idx+ 1 ) ; _IdxWritePtr[ 2 ] = ( ImDrawIdx) ( idx+ 2 ) ;
736
_IdxWritePtr[ 3 ] = idx; _IdxWritePtr[ 4 ] = ( ImDrawIdx) ( idx+ 2 ) ; _IdxWritePtr[ 5 ] = ( ImDrawIdx) ( idx+ 3 ) ;
737
_VtxWritePtr[ 0 ] . pos = a; _VtxWritePtr[ 0 ] . uv = uv_a; _VtxWritePtr[ 0 ] . col = col;
738
_VtxWritePtr[ 1 ] . pos = b; _VtxWritePtr[ 1 ] . uv = uv_b; _VtxWritePtr[ 1 ] . col = col;
739
_VtxWritePtr[ 2 ] . pos = c; _VtxWritePtr[ 2 ] . uv = uv_c; _VtxWritePtr[ 2 ] . col = col;
740
_VtxWritePtr[ 3 ] . pos = d; _VtxWritePtr[ 3 ] . uv = uv_d; _VtxWritePtr[ 3 ] . col = col;
741
_VtxWritePtr += 4 ;
742
_VtxCurrentIdx += 4 ;
743
_IdxWritePtr += 6 ;
744
}
745
746
747
748
749
#define IM_NORMALIZE2F_OVER_ZERO ( VX , VY ) { float d2 = VX* VX + VY* VY; if ( d2 > 0.0f ) { float inv_len = ImRsqrt ( d2 ) ; VX *= inv_len; VY *= inv_len; } } ( void ) 0
750
#define IM_FIXNORMAL2F_MAX_INVLEN2 100.0f
751
#define IM_FIXNORMAL2F ( VX , VY ) { float d2 = VX* VX + VY* VY; if ( d2 > 0.000001f ) { float inv_len2 = 1.0f / d2; if ( inv_len2 > IM_FIXNORMAL2F_MAX_INVLEN2) inv_len2 = IM_FIXNORMAL2F_MAX_INVLEN2; VX *= inv_len2; VY *= inv_len2; } } ( void ) 0
752
753
754
755
void ImDrawList:: AddPolyline ( const ImVec2* points , const int points_count , ImU32 col , ImDrawFlags flags , float thickness )
756
{
757
if ( points_count < 2 || ( col & IM_COL32_A_MASK) == 0 )
758
return ;
759
760
const bool closed = ( flags & ImDrawFlags_Closed) != 0 ;
761
const ImVec2 opaque_uv = _Data-> TexUvWhitePixel ;
762
const int count = closed ? points_count : points_count - 1 ;
763
const bool thick_line = ( thickness > _FringeScale) ;
764
765
if ( Flags & ImDrawListFlags_AntiAliasedLines)
766
{
767
768
const float AA_SIZE = _FringeScale;
769
const ImU32 col_trans = col & ~ IM_COL32_A_MASK;
770
771
772
thickness = ImMax ( thickness, 1.0f ) ;
773
const int integer_thickness = ( int ) thickness;
774
const float fractional_thickness = thickness - integer_thickness;
775
776
777
778
779
const bool use_texture = ( Flags & ImDrawListFlags_AntiAliasedLinesUseTex) && ( integer_thickness < IM_DRAWLIST_TEX_LINES_WIDTH_MAX) && ( fractional_thickness <= 0.00001f ) && ( AA_SIZE == 1.0f ) ;
780
781
782
IM_ASSERT_PARANOID ( ! use_texture || ! ( _Data-> Font -> ContainerAtlas -> Flags & ImFontAtlasFlags_NoBakedLines) ) ;
783
784
const int idx_count = use_texture ? ( count * 6 ) : ( thick_line ? count * 18 : count * 12 ) ;
785
const int vtx_count = use_texture ? ( points_count * 2 ) : ( thick_line ? points_count * 4 : points_count * 3 ) ;
786
PrimReserve ( idx_count, vtx_count ) ;
787
788
789
790
_Data-> TempBuffer . reserve_discard ( points_count * ( ( use_texture || ! thick_line) ? 3 : 5 ) ) ;
791
ImVec2* temp_normals = _Data-> TempBuffer . Data ;
792
ImVec2* temp_points = temp_normals + points_count;
793
794
795
for ( int i1 = 0 ; i1 < count; i1+ + )
796
{
797
const int i2 = ( i1 + 1 ) == points_count ? 0 : i1 + 1 ;
798
float dx = points[ i2] . x - points[ i1] . x ;
799
float dy = points[ i2] . y - points[ i1] . y ;
800
IM_NORMALIZE2F_OVER_ZERO ( dx, dy ) ;
801
temp_normals[ i1] . x = dy;
802
temp_normals[ i1] . y = - dx;
803
}
804
if ( ! closed)
805
temp_normals[ points_count - 1 ] = temp_normals[ points_count - 2 ] ;
806
807
808
if ( use_texture || ! thick_line)
809
{
810
811
812
813
814
815
816
817
818
const float half_draw_size = use_texture ? ( ( thickness * 0.5f ) + 1 ) : AA_SIZE;
819
820
821
if ( ! closed)
822
{
823
temp_points[ 0 ] = points[ 0 ] + temp_normals[ 0 ] * half_draw_size;
824
temp_points[ 1 ] = points[ 0 ] - temp_normals[ 0 ] * half_draw_size;
825
temp_points[ ( points_count- 1 ) * 2 + 0 ] = points[ points_count- 1 ] + temp_normals[ points_count- 1 ] * half_draw_size;
826
temp_points[ ( points_count- 1 ) * 2 + 1 ] = points[ points_count- 1 ] - temp_normals[ points_count- 1 ] * half_draw_size;
827
}
828
829
830
831
832
unsigned int idx1 = _VtxCurrentIdx;
833
for ( int i1 = 0 ; i1 < count; i1+ + )
834
{
835
const int i2 = ( i1 + 1 ) == points_count ? 0 : i1 + 1 ;
836
const unsigned int idx2 = ( ( i1 + 1 ) == points_count) ? _VtxCurrentIdx : ( idx1 + ( use_texture ? 2 : 3 ) ) ;
837
838
839
float dm_x = ( temp_normals[ i1] . x + temp_normals[ i2] . x ) * 0.5f ;
840
float dm_y = ( temp_normals[ i1] . y + temp_normals[ i2] . y ) * 0.5f ;
841
IM_FIXNORMAL2F ( dm_x, dm_y ) ;
842
dm_x *= half_draw_size;
843
dm_y *= half_draw_size;
844
845
846
ImVec2* out_vtx = & temp_points[ i2 * 2 ] ;
847
out_vtx[ 0 ] . x = points[ i2] . x + dm_x;
848
out_vtx[ 0 ] . y = points[ i2] . y + dm_y;
849
out_vtx[ 1 ] . x = points[ i2] . x - dm_x;
850
out_vtx[ 1 ] . y = points[ i2] . y - dm_y;
851
852
if ( use_texture)
853
{
854
855
_IdxWritePtr[ 0 ] = ( ImDrawIdx) ( idx2 + 0 ) ; _IdxWritePtr[ 1 ] = ( ImDrawIdx) ( idx1 + 0 ) ; _IdxWritePtr[ 2 ] = ( ImDrawIdx) ( idx1 + 1 ) ;
856
_IdxWritePtr[ 3 ] = ( ImDrawIdx) ( idx2 + 1 ) ; _IdxWritePtr[ 4 ] = ( ImDrawIdx) ( idx1 + 1 ) ; _IdxWritePtr[ 5 ] = ( ImDrawIdx) ( idx2 + 0 ) ;
857
_IdxWritePtr += 6 ;
858
}
859
else
860
{
861
862
_IdxWritePtr[ 0 ] = ( ImDrawIdx) ( idx2 + 0 ) ; _IdxWritePtr[ 1 ] = ( ImDrawIdx) ( idx1 + 0 ) ; _IdxWritePtr[ 2 ] = ( ImDrawIdx) ( idx1 + 2 ) ;
863
_IdxWritePtr[ 3 ] = ( ImDrawIdx) ( idx1 + 2 ) ; _IdxWritePtr[ 4 ] = ( ImDrawIdx) ( idx2 + 2 ) ; _IdxWritePtr[ 5 ] = ( ImDrawIdx) ( idx2 + 0 ) ;
864
_IdxWritePtr[ 6 ] = ( ImDrawIdx) ( idx2 + 1 ) ; _IdxWritePtr[ 7 ] = ( ImDrawIdx) ( idx1 + 1 ) ; _IdxWritePtr[ 8 ] = ( ImDrawIdx) ( idx1 + 0 ) ;
865
_IdxWritePtr[ 9 ] = ( ImDrawIdx) ( idx1 + 0 ) ; _IdxWritePtr[ 10 ] = ( ImDrawIdx) ( idx2 + 0 ) ; _IdxWritePtr[ 11 ] = ( ImDrawIdx) ( idx2 + 1 ) ;
866
_IdxWritePtr += 12 ;
867
}
868
869
idx1 = idx2;
870
}
871
872
873
if ( use_texture)
874
{
875
876
ImVec4 tex_uvs = _Data-> TexUvLines [ integer_thickness] ;
877
878
879
880
881
882
883
884
885
ImVec2 tex_uv0 ( tex_uvs. x , tex_uvs. y ) ;
886
ImVec2 tex_uv1 ( tex_uvs. z , tex_uvs. w ) ;
887
for ( int i = 0 ; i < points_count; i+ + )
888
{
889
_VtxWritePtr[ 0 ] . pos = temp_points[ i * 2 + 0 ] ; _VtxWritePtr[ 0 ] . uv = tex_uv0; _VtxWritePtr[ 0 ] . col = col;
890
_VtxWritePtr[ 1 ] . pos = temp_points[ i * 2 + 1 ] ; _VtxWritePtr[ 1 ] . uv = tex_uv1; _VtxWritePtr[ 1 ] . col = col;
891
_VtxWritePtr += 2 ;
892
}
893
}
894
else
895
{
896
897
for ( int i = 0 ; i < points_count; i+ + )
898
{
899
_VtxWritePtr[ 0 ] . pos = points[ i] ; _VtxWritePtr[ 0 ] . uv = opaque_uv; _VtxWritePtr[ 0 ] . col = col;
900
_VtxWritePtr[ 1 ] . pos = temp_points[ i * 2 + 0 ] ; _VtxWritePtr[ 1 ] . uv = opaque_uv; _VtxWritePtr[ 1 ] . col = col_trans;
901
_VtxWritePtr[ 2 ] . pos = temp_points[ i * 2 + 1 ] ; _VtxWritePtr[ 2 ] . uv = opaque_uv; _VtxWritePtr[ 2 ] . col = col_trans;
902
_VtxWritePtr += 3 ;
903
}
904
}
905
}
906
else
907
{
908
909
const float half_inner_thickness = ( thickness - AA_SIZE) * 0.5f ;
910
911
912
if ( ! closed)
913
{
914
const int points_last = points_count - 1 ;
915
temp_points[ 0 ] = points[ 0 ] + temp_normals[ 0 ] * ( half_inner_thickness + AA_SIZE) ;
916
temp_points[ 1 ] = points[ 0 ] + temp_normals[ 0 ] * ( half_inner_thickness) ;
917
temp_points[ 2 ] = points[ 0 ] - temp_normals[ 0 ] * ( half_inner_thickness) ;
918
temp_points[ 3 ] = points[ 0 ] - temp_normals[ 0 ] * ( half_inner_thickness + AA_SIZE) ;
919
temp_points[ points_last * 4 + 0 ] = points[ points_last] + temp_normals[ points_last] * ( half_inner_thickness + AA_SIZE) ;
920
temp_points[ points_last * 4 + 1 ] = points[ points_last] + temp_normals[ points_last] * ( half_inner_thickness) ;
921
temp_points[ points_last * 4 + 2 ] = points[ points_last] - temp_normals[ points_last] * ( half_inner_thickness) ;
922
temp_points[ points_last * 4 + 3 ] = points[ points_last] - temp_normals[ points_last] * ( half_inner_thickness + AA_SIZE) ;
923
}
924
925
926
927
928
unsigned int idx1 = _VtxCurrentIdx;
929
for ( int i1 = 0 ; i1 < count; i1+ + )
930
{
931
const int i2 = ( i1 + 1 ) == points_count ? 0 : ( i1 + 1 ) ;
932
const unsigned int idx2 = ( i1 + 1 ) == points_count ? _VtxCurrentIdx : ( idx1 + 4 ) ;
933
934
935
float dm_x = ( temp_normals[ i1] . x + temp_normals[ i2] . x ) * 0.5f ;
936
float dm_y = ( temp_normals[ i1] . y + temp_normals[ i2] . y ) * 0.5f ;
937
IM_FIXNORMAL2F ( dm_x, dm_y ) ;
938
float dm_out_x = dm_x * ( half_inner_thickness + AA_SIZE) ;
939
float dm_out_y = dm_y * ( half_inner_thickness + AA_SIZE) ;
940
float dm_in_x = dm_x * half_inner_thickness;
941
float dm_in_y = dm_y * half_inner_thickness;
942
943
944
ImVec2* out_vtx = & temp_points[ i2 * 4 ] ;
945
out_vtx[ 0 ] . x = points[ i2] . x + dm_out_x;
946
out_vtx[ 0 ] . y = points[ i2] . y + dm_out_y;
947
out_vtx[ 1 ] . x = points[ i2] . x + dm_in_x;
948
out_vtx[ 1 ] . y = points[ i2] . y + dm_in_y;
949
out_vtx[ 2 ] . x = points[ i2] . x - dm_in_x;
950
out_vtx[ 2 ] . y = points[ i2] . y - dm_in_y;
951
out_vtx[ 3 ] . x = points[ i2] . x - dm_out_x;
952
out_vtx[ 3 ] . y = points[ i2] . y - dm_out_y;
953
954
955
_IdxWritePtr[ 0 ] = ( ImDrawIdx) ( idx2 + 1 ) ; _IdxWritePtr[ 1 ] = ( ImDrawIdx) ( idx1 + 1 ) ; _IdxWritePtr[ 2 ] = ( ImDrawIdx) ( idx1 + 2 ) ;
956
_IdxWritePtr[ 3 ] = ( ImDrawIdx) ( idx1 + 2 ) ; _IdxWritePtr[ 4 ] = ( ImDrawIdx) ( idx2 + 2 ) ; _IdxWritePtr[ 5 ] = ( ImDrawIdx) ( idx2 + 1 ) ;
957
_IdxWritePtr[ 6 ] = ( ImDrawIdx) ( idx2 + 1 ) ; _IdxWritePtr[ 7 ] = ( ImDrawIdx) ( idx1 + 1 ) ; _IdxWritePtr[ 8 ] = ( ImDrawIdx) ( idx1 + 0 ) ;
958
_IdxWritePtr[ 9 ] = ( ImDrawIdx) ( idx1 + 0 ) ; _IdxWritePtr[ 10 ] = ( ImDrawIdx) ( idx2 + 0 ) ; _IdxWritePtr[ 11 ] = ( ImDrawIdx) ( idx2 + 1 ) ;
959
_IdxWritePtr[ 12 ] = ( ImDrawIdx) ( idx2 + 2 ) ; _IdxWritePtr[ 13 ] = ( ImDrawIdx) ( idx1 + 2 ) ; _IdxWritePtr[ 14 ] = ( ImDrawIdx) ( idx1 + 3 ) ;
960
_IdxWritePtr[ 15 ] = ( ImDrawIdx) ( idx1 + 3 ) ; _IdxWritePtr[ 16 ] = ( ImDrawIdx) ( idx2 + 3 ) ; _IdxWritePtr[ 17 ] = ( ImDrawIdx) ( idx2 + 2 ) ;
961
_IdxWritePtr += 18 ;
962
963
idx1 = idx2;
964
}
965
966
967
for ( int i = 0 ; i < points_count; i+ + )
968
{
969
_VtxWritePtr[ 0 ] . pos = temp_points[ i * 4 + 0 ] ; _VtxWritePtr[ 0 ] . uv = opaque_uv; _VtxWritePtr[ 0 ] . col = col_trans;
970
_VtxWritePtr[ 1 ] . pos = temp_points[ i * 4 + 1 ] ; _VtxWritePtr[ 1 ] . uv = opaque_uv; _VtxWritePtr[ 1 ] . col = col;
971
_VtxWritePtr[ 2 ] . pos = temp_points[ i * 4 + 2 ] ; _VtxWritePtr[ 2 ] . uv = opaque_uv; _VtxWritePtr[ 2 ] . col = col;
972
_VtxWritePtr[ 3 ] . pos = temp_points[ i * 4 + 3 ] ; _VtxWritePtr[ 3 ] . uv = opaque_uv; _VtxWritePtr[ 3 ] . col = col_trans;
973
_VtxWritePtr += 4 ;
974
}
975
}
976
_VtxCurrentIdx += ( ImDrawIdx) vtx_count;
977
}
978
else
979
{
980
981
const int idx_count = count * 6 ;
982
const int vtx_count = count * 4 ;
983
PrimReserve ( idx_count, vtx_count ) ;
984
985
for ( int i1 = 0 ; i1 < count; i1+ + )
986
{
987
const int i2 = ( i1 + 1 ) == points_count ? 0 : i1 + 1 ;
988
const ImVec2& p1 = points[ i1] ;
989
const ImVec2& p2 = points[ i2] ;
990
991
float dx = p2. x - p1. x ;
992
float dy = p2. y - p1. y ;
993
IM_NORMALIZE2F_OVER_ZERO ( dx, dy ) ;
994
dx *= ( thickness * 0.5f ) ;
995
dy *= ( thickness * 0.5f ) ;
996
997
_VtxWritePtr[ 0 ] . pos . x = p1. x + dy; _VtxWritePtr[ 0 ] . pos . y = p1. y - dx; _VtxWritePtr[ 0 ] . uv = opaque_uv; _VtxWritePtr[ 0 ] . col = col;
998
_VtxWritePtr[ 1 ] . pos . x = p2. x + dy; _VtxWritePtr[ 1 ] . pos . y = p2. y - dx; _VtxWritePtr[ 1 ] . uv = opaque_uv; _VtxWritePtr[ 1 ] . col = col;
999
_VtxWritePtr[ 2 ] . pos . x = p2. x - dy; _VtxWritePtr[ 2 ] . pos . y = p2. y + dx; _VtxWritePtr[ 2 ] . uv = opaque_uv; _VtxWritePtr[ 2 ] . col = col;
1000
_VtxWritePtr[ 3 ] . pos . x = p1. x - dy; _VtxWritePtr[ 3 ] . pos . y = p1. y + dx; _VtxWritePtr[ 3 ] . uv = opaque_uv; _VtxWritePtr[ 3 ] . col = col;
1001
_VtxWritePtr += 4 ;
1002
1003
_IdxWritePtr[ 0 ] = ( ImDrawIdx) ( _VtxCurrentIdx) ; _IdxWritePtr[ 1 ] = ( ImDrawIdx) ( _VtxCurrentIdx + 1 ) ; _IdxWritePtr[ 2 ] = ( ImDrawIdx) ( _VtxCurrentIdx + 2 ) ;
1004
_IdxWritePtr[ 3 ] = ( ImDrawIdx) ( _VtxCurrentIdx) ; _IdxWritePtr[ 4 ] = ( ImDrawIdx) ( _VtxCurrentIdx + 2 ) ; _IdxWritePtr[ 5 ] = ( ImDrawIdx) ( _VtxCurrentIdx + 3 ) ;
1005
_IdxWritePtr += 6 ;
1006
_VtxCurrentIdx += 4 ;
1007
}
1008
}
1009
}
1010
1011
1012
1013
void ImDrawList:: AddConvexPolyFilled ( const ImVec2* points , const int points_count , ImU32 col )
1014
{
1015
if ( points_count < 3 || ( col & IM_COL32_A_MASK) == 0 )
1016
return ;
1017
1018
const ImVec2 uv = _Data-> TexUvWhitePixel ;
1019
1020
if ( Flags & ImDrawListFlags_AntiAliasedFill)
1021
{
1022
1023
const float AA_SIZE = _FringeScale;
1024
const ImU32 col_trans = col & ~ IM_COL32_A_MASK;
1025
const int idx_count = ( points_count - 2 ) * 3 + points_count * 6 ;
1026
const int vtx_count = ( points_count * 2 ) ;
1027
PrimReserve ( idx_count, vtx_count ) ;
1028
1029
1030
unsigned int vtx_inner_idx = _VtxCurrentIdx;
1031
unsigned int vtx_outer_idx = _VtxCurrentIdx + 1 ;
1032
for ( int i = 2 ; i < points_count; i+ + )
1033
{
1034
_IdxWritePtr[ 0 ] = ( ImDrawIdx) ( vtx_inner_idx) ; _IdxWritePtr[ 1 ] = ( ImDrawIdx) ( vtx_inner_idx + ( ( i - 1 ) << 1 ) ) ; _IdxWritePtr[ 2 ] = ( ImDrawIdx) ( vtx_inner_idx + ( i << 1 ) ) ;
1035
_IdxWritePtr += 3 ;
1036
}
1037
1038
1039
_Data-> TempBuffer . reserve_discard ( points_count ) ;
1040
ImVec2* temp_normals = _Data-> TempBuffer . Data ;
1041
for ( int i0 = points_count - 1 , i1 = 0 ; i1 < points_count; i0 = i1+ + )
1042
{
1043
const ImVec2& p0 = points[ i0] ;
1044
const ImVec2& p1 = points[ i1] ;
1045
float dx = p1. x - p0. x ;
1046
float dy = p1. y - p0. y ;
1047
IM_NORMALIZE2F_OVER_ZERO ( dx, dy ) ;
1048
temp_normals[ i0] . x = dy;
1049
temp_normals[ i0] . y = - dx;
1050
}
1051
1052
for ( int i0 = points_count - 1 , i1 = 0 ; i1 < points_count; i0 = i1+ + )
1053
{
1054
1055
const ImVec2& n0 = temp_normals[ i0] ;
1056
const ImVec2& n1 = temp_normals[ i1] ;
1057
float dm_x = ( n0. x + n1. x ) * 0.5f ;
1058
float dm_y = ( n0. y + n1. y ) * 0.5f ;
1059
IM_FIXNORMAL2F ( dm_x, dm_y ) ;
1060
dm_x *= AA_SIZE * 0.5f ;
1061
dm_y *= AA_SIZE * 0.5f ;
1062
1063
1064
_VtxWritePtr[ 0 ] . pos . x = ( points[ i1] . x - dm_x) ; _VtxWritePtr[ 0 ] . pos . y = ( points[ i1] . y - dm_y) ; _VtxWritePtr[ 0 ] . uv = uv; _VtxWritePtr[ 0 ] . col = col;
1065
_VtxWritePtr[ 1 ] . pos . x = ( points[ i1] . x + dm_x) ; _VtxWritePtr[ 1 ] . pos . y = ( points[ i1] . y + dm_y) ; _VtxWritePtr[ 1 ] . uv = uv; _VtxWritePtr[ 1 ] . col = col_trans;
1066
_VtxWritePtr += 2 ;
1067
1068
1069
_IdxWritePtr[ 0 ] = ( ImDrawIdx) ( vtx_inner_idx + ( i1 << 1 ) ) ; _IdxWritePtr[ 1 ] = ( ImDrawIdx) ( vtx_inner_idx + ( i0 << 1 ) ) ; _IdxWritePtr[ 2 ] = ( ImDrawIdx) ( vtx_outer_idx + ( i0 << 1 ) ) ;
1070
_IdxWritePtr[ 3 ] = ( ImDrawIdx) ( vtx_outer_idx + ( i0 << 1 ) ) ; _IdxWritePtr[ 4 ] = ( ImDrawIdx) ( vtx_outer_idx + ( i1 << 1 ) ) ; _IdxWritePtr[ 5 ] = ( ImDrawIdx) ( vtx_inner_idx + ( i1 << 1 ) ) ;
1071
_IdxWritePtr += 6 ;
1072
}
1073
_VtxCurrentIdx += ( ImDrawIdx) vtx_count;
1074
}
1075
else
1076
{
1077
1078
const int idx_count = ( points_count - 2 ) * 3 ;
1079
const int vtx_count = points_count;
1080
PrimReserve ( idx_count, vtx_count ) ;
1081
for ( int i = 0 ; i < vtx_count; i+ + )
1082
{
1083
_VtxWritePtr[ 0 ] . pos = points[ i] ; _VtxWritePtr[ 0 ] . uv = uv; _VtxWritePtr[ 0 ] . col = col;
1084
_VtxWritePtr+ + ;
1085
}
1086
for ( int i = 2 ; i < points_count; i+ + )
1087
{
1088
_IdxWritePtr[ 0 ] = ( ImDrawIdx) ( _VtxCurrentIdx) ; _IdxWritePtr[ 1 ] = ( ImDrawIdx) ( _VtxCurrentIdx + i - 1 ) ; _IdxWritePtr[ 2 ] = ( ImDrawIdx) ( _VtxCurrentIdx + i) ;
1089
_IdxWritePtr += 3 ;
1090
}
1091
_VtxCurrentIdx += ( ImDrawIdx) vtx_count;
1092
}
1093
}
1094
1095
void ImDrawList:: _PathArcToFastEx ( const ImVec2& center , float radius , int a_min_sample , int a_max_sample , int a_step )
1096
{
1097
if ( radius < 0.5f )
1098
{
1099
_Path. push_back ( center ) ;
1100
return ;
1101
}
1102
1103
1104
if ( a_step <= 0 )
1105
a_step = IM_DRAWLIST_ARCFAST_SAMPLE_MAX / _CalcCircleAutoSegmentCount ( radius ) ;
1106
1107
1108
a_step = ImClamp ( a_step, 1 , IM_DRAWLIST_ARCFAST_TABLE_SIZE / 4 ) ;
1109
1110
const int sample_range = ImAbs ( a_max_sample - a_min_sample ) ;
1111
const int a_next_step = a_step;
1112
1113
int samples = sample_range + 1 ;
1114
bool extra_max_sample = false ;
1115
if ( a_step > 1 )
1116
{
1117
samples = sample_range / a_step + 1 ;
1118
const int overstep = sample_range % a_step;
1119
1120
if ( overstep > 0 )
1121
{
1122
extra_max_sample = true ;
1123
samples+ + ;
1124
1125
1126
1127
if ( sample_range > 0 )
1128
a_step -= ( a_step - overstep) / 2 ;
1129
}
1130
}
1131
1132
_Path. resize ( _Path. Size + samples ) ;
1133
ImVec2* out_ptr = _Path. Data + ( _Path. Size - samples) ;
1134
1135
int sample_index = a_min_sample;
1136
if ( sample_index < 0 || sample_index >= IM_DRAWLIST_ARCFAST_SAMPLE_MAX)
1137
{
1138
sample_index = sample_index % IM_DRAWLIST_ARCFAST_SAMPLE_MAX;
1139
if ( sample_index < 0 )
1140
sample_index += IM_DRAWLIST_ARCFAST_SAMPLE_MAX;
1141
}
1142
1143
if ( a_max_sample >= a_min_sample)
1144
{
1145
for ( int a = a_min_sample; a <= a_max_sample; a += a_step, sample_index += a_step, a_step = a_next_step)
1146
{
1147
1148
if ( sample_index >= IM_DRAWLIST_ARCFAST_SAMPLE_MAX)
1149
sample_index -= IM_DRAWLIST_ARCFAST_SAMPLE_MAX;
1150
1151
const ImVec2 s = _Data-> ArcFastVtx [ sample_index] ;
1152
out_ptr-> x = center. x + s. x * radius;
1153
out_ptr-> y = center. y + s. y * radius;
1154
out_ptr+ + ;
1155
}
1156
}
1157
else
1158
{
1159
for ( int a = a_min_sample; a >= a_max_sample; a -= a_step, sample_index -= a_step, a_step = a_next_step)
1160
{
1161
1162
if ( sample_index < 0 )
1163
sample_index += IM_DRAWLIST_ARCFAST_SAMPLE_MAX;
1164
1165
const ImVec2 s = _Data-> ArcFastVtx [ sample_index] ;
1166
out_ptr-> x = center. x + s. x * radius;
1167
out_ptr-> y = center. y + s. y * radius;
1168
out_ptr+ + ;
1169
}
1170
}
1171
1172
if ( extra_max_sample)
1173
{
1174
int normalized_max_sample = a_max_sample % IM_DRAWLIST_ARCFAST_SAMPLE_MAX;
1175
if ( normalized_max_sample < 0 )
1176
normalized_max_sample += IM_DRAWLIST_ARCFAST_SAMPLE_MAX;
1177
1178
const ImVec2 s = _Data-> ArcFastVtx [ normalized_max_sample] ;
1179
out_ptr-> x = center. x + s. x * radius;
1180
out_ptr-> y = center. y + s. y * radius;
1181
out_ptr+ + ;
1182
}
1183
1184
IM_ASSERT_PARANOID ( _Path. Data + _Path. Size == out_ptr ) ;
1185
}
1186
1187
void ImDrawList:: _PathArcToN ( const ImVec2& center , float radius , float a_min , float a_max , int num_segments )
1188
{
1189
if ( radius < 0.5f )
1190
{
1191
_Path. push_back ( center ) ;
1192
return ;
1193
}
1194
1195
1196
1197
_Path. reserve ( _Path. Size + ( num_segments + 1 ) ) ;
1198
for ( int i = 0 ; i <= num_segments; i+ + )
1199
{
1200
const float a = a_min + ( ( float ) i / ( float ) num_segments) * ( a_max - a_min) ;
1201
_Path. push_back ( ImVec2 ( center. x + ImCos ( a ) * radius, center. y + ImSin ( a ) * radius ) ) ;
1202
}
1203
}
1204
1205
1206
void ImDrawList:: PathArcToFast ( const ImVec2& center , float radius , int a_min_of_12 , int a_max_of_12 )
1207
{
1208
if ( radius < 0.5f )
1209
{
1210
_Path. push_back ( center ) ;
1211
return ;
1212
}
1213
_PathArcToFastEx ( center, radius, a_min_of_12 * IM_DRAWLIST_ARCFAST_SAMPLE_MAX / 12 , a_max_of_12 * IM_DRAWLIST_ARCFAST_SAMPLE_MAX / 12 , 0 ) ;
1214
}
1215
1216
void ImDrawList:: PathArcTo ( const ImVec2& center , float radius , float a_min , float a_max , int num_segments )
1217
{
1218
if ( radius < 0.5f )
1219
{
1220
_Path. push_back ( center ) ;
1221
return ;
1222
}
1223
1224
if ( num_segments > 0 )
1225
{
1226
_PathArcToN ( center, radius, a_min, a_max, num_segments ) ;
1227
return ;
1228
}
1229
1230
1231
if ( radius <= _Data-> ArcFastRadiusCutoff )
1232
{
1233
const bool a_is_reverse = a_max < a_min;
1234
1235
1236
1237
const float a_min_sample_f = IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_min / ( IM_PI * 2.0f ) ;
1238
const float a_max_sample_f = IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_max / ( IM_PI * 2.0f ) ;
1239
1240
const int a_min_sample = a_is_reverse ? ( int ) ImFloor ( a_min_sample_f ) : ( int ) ImCeil ( a_min_sample_f ) ;
1241
const int a_max_sample = a_is_reverse ? ( int ) ImCeil ( a_max_sample_f ) : ( int ) ImFloor ( a_max_sample_f ) ;
1242
const int a_mid_samples = a_is_reverse ? ImMax ( a_min_sample - a_max_sample, 0 ) : ImMax ( a_max_sample - a_min_sample, 0 ) ;
1243
1244
const float a_min_segment_angle = a_min_sample * IM_PI * 2.0f / IM_DRAWLIST_ARCFAST_SAMPLE_MAX;
1245
const float a_max_segment_angle = a_max_sample * IM_PI * 2.0f / IM_DRAWLIST_ARCFAST_SAMPLE_MAX;
1246
const bool a_emit_start = ImAbs ( a_min_segment_angle - a_min ) >= 1e-5f ;
1247
const bool a_emit_end = ImAbs ( a_max - a_max_segment_angle ) >= 1e-5f ;
1248
1249
_Path. reserve ( _Path. Size + ( a_mid_samples + 1 + ( a_emit_start ? 1 : 0 ) + ( a_emit_end ? 1 : 0 ) ) ) ;
1250
if ( a_emit_start)
1251
_Path. push_back ( ImVec2 ( center. x + ImCos ( a_min ) * radius, center. y + ImSin ( a_min ) * radius ) ) ;
1252
if ( a_mid_samples > 0 )
1253
_PathArcToFastEx ( center, radius, a_min_sample, a_max_sample, 0 ) ;
1254
if ( a_emit_end)
1255
_Path. push_back ( ImVec2 ( center. x + ImCos ( a_max ) * radius, center. y + ImSin ( a_max ) * radius ) ) ;
1256
}
1257
else
1258
{
1259
const float arc_length = ImAbs ( a_max - a_min ) ;
1260
const int circle_segment_count = _CalcCircleAutoSegmentCount ( radius ) ;
1261
const int arc_segment_count = ImMax ( ( int ) ImCeil ( circle_segment_count * arc_length / ( IM_PI * 2.0f ) ) , ( int ) ( 2.0f * IM_PI / arc_length) ) ;
1262
_PathArcToN ( center, radius, a_min, a_max, arc_segment_count ) ;
1263
}
1264
}
1265
1266
void ImDrawList:: PathEllipticalArcTo ( const ImVec2& center , const ImVec2& radius , float rot , float a_min , float a_max , int num_segments )
1267
{
1268
if ( num_segments <= 0 )
1269
num_segments = _CalcCircleAutoSegmentCount ( ImMax ( radius. x , radius. y ) ) ;
1270
1271
_Path. reserve ( _Path. Size + ( num_segments + 1 ) ) ;
1272
1273
const float cos_rot = ImCos ( rot ) ;
1274
const float sin_rot = ImSin ( rot ) ;
1275
for ( int i = 0 ; i <= num_segments; i+ + )
1276
{
1277
const float a = a_min + ( ( float ) i / ( float ) num_segments) * ( a_max - a_min) ;
1278
ImVec2 point ( ImCos ( a ) * radius. x , ImSin ( a ) * radius. y ) ;
1279
const ImVec2 rel ( ( point. x * cos_rot) - ( point. y * sin_rot) , ( point. x * sin_rot) + ( point. y * cos_rot) ) ;
1280
point. x = rel. x + center. x ;
1281
point. y = rel. y + center. y ;
1282
_Path. push_back ( point ) ;
1283
}
1284
}
1285
1286
ImVec2 ImBezierCubicCalc ( const ImVec2& p1 , const ImVec2& p2 , const ImVec2& p3 , const ImVec2& p4 , float t )
1287
{
1288
float u = 1.0f - t;
1289
float w1 = u * u * u;
1290
float w2 = 3 * u * u * t;
1291
float w3 = 3 * u * t * t;
1292
float w4 = t * t * t;
1293
return ImVec2 ( w1 * p1. x + w2 * p2. x + w3 * p3. x + w4 * p4. x , w1 * p1. y + w2 * p2. y + w3 * p3. y + w4 * p4. y ) ;
1294
}
1295
1296
ImVec2 ImBezierQuadraticCalc ( const ImVec2& p1 , const ImVec2& p2 , const ImVec2& p3 , float t )
1297
{
1298
float u = 1.0f - t;
1299
float w1 = u * u;
1300
float w2 = 2 * u * t;
1301
float w3 = t * t;
1302
return ImVec2 ( w1 * p1. x + w2 * p2. x + w3 * p3. x , w1 * p1. y + w2 * p2. y + w3 * p3. y ) ;
1303
}
1304
1305
1306
static void PathBezierCubicCurveToCasteljau ( ImVector< ImVec2> * path , float x1 , float y1 , float x2 , float y2 , float x3 , float y3 , float x4 , float y4 , float tess_tol , int level )
1307
{
1308
float dx = x4 - x1;
1309
float dy = y4 - y1;
1310
float d2 = ( x2 - x4) * dy - ( y2 - y4) * dx;
1311
float d3 = ( x3 - x4) * dy - ( y3 - y4) * dx;
1312
d2 = ( d2 >= 0 ) ? d2 : - d2;
1313
d3 = ( d3 >= 0 ) ? d3 : - d3;
1314
if ( ( d2 + d3) * ( d2 + d3) < tess_tol * ( dx * dx + dy * dy) )
1315
{
1316
path-> push_back ( ImVec2 ( x4, y4 ) ) ;
1317
}
1318
else if ( level < 10 )
1319
{
1320
float x12 = ( x1 + x2) * 0.5f , y12 = ( y1 + y2) * 0.5f ;
1321
float x23 = ( x2 + x3) * 0.5f , y23 = ( y2 + y3) * 0.5f ;
1322
float x34 = ( x3 + x4) * 0.5f , y34 = ( y3 + y4) * 0.5f ;
1323
float x123 = ( x12 + x23) * 0.5f , y123 = ( y12 + y23) * 0.5f ;
1324
float x234 = ( x23 + x34) * 0.5f , y234 = ( y23 + y34) * 0.5f ;
1325
float x1234 = ( x123 + x234) * 0.5f , y1234 = ( y123 + y234) * 0.5f ;
1326
PathBezierCubicCurveToCasteljau ( path, x1, y1, x12, y12, x123, y123, x1234, y1234, tess_tol, level + 1 ) ;
1327
PathBezierCubicCurveToCasteljau ( path, x1234, y1234, x234, y234, x34, y34, x4, y4, tess_tol, level + 1 ) ;
1328
}
1329
}
1330
1331
static void PathBezierQuadraticCurveToCasteljau ( ImVector< ImVec2> * path , float x1 , float y1 , float x2 , float y2 , float x3 , float y3 , float tess_tol , int level )
1332
{
1333
float dx = x3 - x1, dy = y3 - y1;
1334
float det = ( x2 - x3) * dy - ( y2 - y3) * dx;
1335
if ( det * det * 4.0f < tess_tol * ( dx * dx + dy * dy) )
1336
{
1337
path-> push_back ( ImVec2 ( x3, y3 ) ) ;
1338
}
1339
else if ( level < 10 )
1340
{
1341
float x12 = ( x1 + x2) * 0.5f , y12 = ( y1 + y2) * 0.5f ;
1342
float x23 = ( x2 + x3) * 0.5f , y23 = ( y2 + y3) * 0.5f ;
1343
float x123 = ( x12 + x23) * 0.5f , y123 = ( y12 + y23) * 0.5f ;
1344
PathBezierQuadraticCurveToCasteljau ( path, x1, y1, x12, y12, x123, y123, tess_tol, level + 1 ) ;
1345
PathBezierQuadraticCurveToCasteljau ( path, x123, y123, x23, y23, x3, y3, tess_tol, level + 1 ) ;
1346
}
1347
}
1348
1349
void ImDrawList:: PathBezierCubicCurveTo ( const ImVec2& p2 , const ImVec2& p3 , const ImVec2& p4 , int num_segments )
1350
{
1351
ImVec2 p1 = _Path. back ( ) ;
1352
if ( num_segments == 0 )
1353
{
1354
IM_ASSERT ( _Data-> CurveTessellationTol > 0.0f ) ;
1355
PathBezierCubicCurveToCasteljau ( & _Path, p1. x , p1. y , p2. x , p2. y , p3. x , p3. y , p4. x , p4. y , _Data-> CurveTessellationTol , 0 ) ;
1356
}
1357
else
1358
{
1359
float t_step = 1.0f / ( float ) num_segments;
1360
for ( int i_step = 1 ; i_step <= num_segments; i_step+ + )
1361
_Path. push_back ( ImBezierCubicCalc ( p1, p2, p3, p4, t_step * i_step ) ) ;
1362
}
1363
}
1364
1365
void ImDrawList:: PathBezierQuadraticCurveTo ( const ImVec2& p2 , const ImVec2& p3 , int num_segments )
1366
{
1367
ImVec2 p1 = _Path. back ( ) ;
1368
if ( num_segments == 0 )
1369
{
1370
IM_ASSERT ( _Data-> CurveTessellationTol > 0.0f ) ;
1371
PathBezierQuadraticCurveToCasteljau ( & _Path, p1. x , p1. y , p2. x , p2. y , p3. x , p3. y , _Data-> CurveTessellationTol , 0 ) ;
1372
}
1373
else
1374
{
1375
float t_step = 1.0f / ( float ) num_segments;
1376
for ( int i_step = 1 ; i_step <= num_segments; i_step+ + )
1377
_Path. push_back ( ImBezierQuadraticCalc ( p1, p2, p3, t_step * i_step ) ) ;
1378
}
1379
}
1380
1381
static inline ImDrawFlags FixRectCornerFlags ( ImDrawFlags flags )
1382
{
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
IM_ASSERT ( ( flags & 0x0F ) == 0 && " Misuse of legacy hardcoded ImDrawCornerFlags values!" ) ;
1398
1399
if ( ( flags & ImDrawFlags_RoundCornersMask_) == 0 )
1400
flags |= ImDrawFlags_RoundCornersAll;
1401
1402
return flags;
1403
}
1404
1405
void ImDrawList:: PathRect ( const ImVec2& a , const ImVec2& b , float rounding , ImDrawFlags flags )
1406
{
1407
if ( rounding >= 0.5f )
1408
{
1409
flags = FixRectCornerFlags ( flags ) ;
1410
rounding = ImMin ( rounding, ImFabs ( b. x - a. x ) * ( ( ( flags & ImDrawFlags_RoundCornersTop) == ImDrawFlags_RoundCornersTop) || ( ( flags & ImDrawFlags_RoundCornersBottom) == ImDrawFlags_RoundCornersBottom) ? 0.5f : 1.0f ) - 1.0f ) ;
1411
rounding = ImMin ( rounding, ImFabs ( b. y - a. y ) * ( ( ( flags & ImDrawFlags_RoundCornersLeft) == ImDrawFlags_RoundCornersLeft) || ( ( flags & ImDrawFlags_RoundCornersRight) == ImDrawFlags_RoundCornersRight) ? 0.5f : 1.0f ) - 1.0f ) ;
1412
}
1413
if ( rounding < 0.5f || ( flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone)
1414
{
1415
PathLineTo ( a ) ;
1416
PathLineTo ( ImVec2 ( b. x , a. y ) ) ;
1417
PathLineTo ( b ) ;
1418
PathLineTo ( ImVec2 ( a. x , b. y ) ) ;
1419
}
1420
else
1421
{
1422
const float rounding_tl = ( flags & ImDrawFlags_RoundCornersTopLeft) ? rounding : 0.0f ;
1423
const float rounding_tr = ( flags & ImDrawFlags_RoundCornersTopRight) ? rounding : 0.0f ;
1424
const float rounding_br = ( flags & ImDrawFlags_RoundCornersBottomRight) ? rounding : 0.0f ;
1425
const float rounding_bl = ( flags & ImDrawFlags_RoundCornersBottomLeft) ? rounding : 0.0f ;
1426
PathArcToFast ( ImVec2 ( a. x + rounding_tl, a. y + rounding_tl ) , rounding_tl, 6 , 9 ) ;
1427
PathArcToFast ( ImVec2 ( b. x - rounding_tr, a. y + rounding_tr ) , rounding_tr, 9 , 12 ) ;
1428
PathArcToFast ( ImVec2 ( b. x - rounding_br, b. y - rounding_br ) , rounding_br, 0 , 3 ) ;
1429
PathArcToFast ( ImVec2 ( a. x + rounding_bl, b. y - rounding_bl ) , rounding_bl, 3 , 6 ) ;
1430
}
1431
}
1432
1433
void ImDrawList:: AddLine ( const ImVec2& p1 , const ImVec2& p2 , ImU32 col , float thickness )
1434
{
1435
if ( ( col & IM_COL32_A_MASK) == 0 )
1436
return ;
1437
PathLineTo ( p1 + ImVec2 ( 0.5f , 0.5f ) ) ;
1438
PathLineTo ( p2 + ImVec2 ( 0.5f , 0.5f ) ) ;
1439
PathStroke ( col, 0 , thickness ) ;
1440
}
1441
1442
1443
1444
void ImDrawList:: AddRect ( const ImVec2& p_min , const ImVec2& p_max , ImU32 col , float rounding , ImDrawFlags flags , float thickness )
1445
{
1446
if ( ( col & IM_COL32_A_MASK) == 0 )
1447
return ;
1448
if ( Flags & ImDrawListFlags_AntiAliasedLines)
1449
PathRect ( p_min + ImVec2 ( 0.50f , 0.50f ) , p_max - ImVec2 ( 0.50f , 0.50f ) , rounding, flags ) ;
1450
else
1451
PathRect ( p_min + ImVec2 ( 0.50f , 0.50f ) , p_max - ImVec2 ( 0.49f , 0.49f ) , rounding, flags ) ;
1452
PathStroke ( col, ImDrawFlags_Closed, thickness ) ;
1453
}
1454
1455
void ImDrawList:: AddRectFilled ( const ImVec2& p_min , const ImVec2& p_max , ImU32 col , float rounding , ImDrawFlags flags )
1456
{
1457
if ( ( col & IM_COL32_A_MASK) == 0 )
1458
return ;
1459
if ( rounding < 0.5f || ( flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone)
1460
{
1461
PrimReserve ( 6 , 4 ) ;
1462
PrimRect ( p_min, p_max, col ) ;
1463
}
1464
else
1465
{
1466
PathRect ( p_min, p_max, rounding, flags ) ;
1467
PathFillConvex ( col ) ;
1468
}
1469
}
1470
1471
1472
void ImDrawList:: AddRectFilledMultiColor ( const ImVec2& p_min , const ImVec2& p_max , ImU32 col_upr_left , ImU32 col_upr_right , ImU32 col_bot_right , ImU32 col_bot_left )
1473
{
1474
if ( ( ( col_upr_left | col_upr_right | col_bot_right | col_bot_left) & IM_COL32_A_MASK) == 0 )
1475
return ;
1476
1477
const ImVec2 uv = _Data-> TexUvWhitePixel ;
1478
PrimReserve ( 6 , 4 ) ;
1479
PrimWriteIdx ( ( ImDrawIdx) ( _VtxCurrentIdx) ) ; PrimWriteIdx ( ( ImDrawIdx) ( _VtxCurrentIdx + 1 ) ) ; PrimWriteIdx ( ( ImDrawIdx) ( _VtxCurrentIdx + 2 ) ) ;
1480
PrimWriteIdx ( ( ImDrawIdx) ( _VtxCurrentIdx) ) ; PrimWriteIdx ( ( ImDrawIdx) ( _VtxCurrentIdx + 2 ) ) ; PrimWriteIdx ( ( ImDrawIdx) ( _VtxCurrentIdx + 3 ) ) ;
1481
PrimWriteVtx ( p_min, uv, col_upr_left ) ;
1482
PrimWriteVtx ( ImVec2 ( p_max. x , p_min. y ) , uv, col_upr_right) ;
1483
PrimWriteVtx ( p_max, uv, col_bot_right ) ;
1484
PrimWriteVtx ( ImVec2 ( p_min. x , p_max. y ) , uv, col_bot_left) ;
1485
}
1486
1487
void ImDrawList:: AddQuad ( const ImVec2& p1 , const ImVec2& p2 , const ImVec2& p3 , const ImVec2& p4 , ImU32 col , float thickness )
1488
{
1489
if ( ( col & IM_COL32_A_MASK) == 0 )
1490
return ;
1491
1492
PathLineTo ( p1 ) ;
1493
PathLineTo ( p2 ) ;
1494
PathLineTo ( p3 ) ;
1495
PathLineTo ( p4 ) ;
1496
PathStroke ( col, ImDrawFlags_Closed, thickness ) ;
1497
}
1498
1499
void ImDrawList:: AddQuadFilled ( const ImVec2& p1 , const ImVec2& p2 , const ImVec2& p3 , const ImVec2& p4 , ImU32 col )
1500
{
1501
if ( ( col & IM_COL32_A_MASK) == 0 )
1502
return ;
1503
1504
PathLineTo ( p1 ) ;
1505
PathLineTo ( p2 ) ;
1506
PathLineTo ( p3 ) ;
1507
PathLineTo ( p4 ) ;
1508
PathFillConvex ( col ) ;
1509
}
1510
1511
void ImDrawList:: AddTriangle ( const ImVec2& p1 , const ImVec2& p2 , const ImVec2& p3 , ImU32 col , float thickness )
1512
{
1513
if ( ( col & IM_COL32_A_MASK) == 0 )
1514
return ;
1515
1516
PathLineTo ( p1 ) ;
1517
PathLineTo ( p2 ) ;
1518
PathLineTo ( p3 ) ;
1519
PathStroke ( col, ImDrawFlags_Closed, thickness ) ;
1520
}
1521
1522
void ImDrawList:: AddTriangleFilled ( const ImVec2& p1 , const ImVec2& p2 , const ImVec2& p3 , ImU32 col )
1523
{
1524
if ( ( col & IM_COL32_A_MASK) == 0 )
1525
return ;
1526
1527
PathLineTo ( p1 ) ;
1528
PathLineTo ( p2 ) ;
1529
PathLineTo ( p3 ) ;
1530
PathFillConvex ( col ) ;
1531
}
1532
1533
void ImDrawList:: AddCircle ( const ImVec2& center , float radius , ImU32 col , int num_segments , float thickness )
1534
{
1535
if ( ( col & IM_COL32_A_MASK) == 0 || radius < 0.5f )
1536
return ;
1537
1538
if ( num_segments <= 0 )
1539
{
1540
1541
_PathArcToFastEx ( center, radius - 0.5f , 0 , IM_DRAWLIST_ARCFAST_SAMPLE_MAX, 0 ) ;
1542
_Path. Size - - ;
1543
}
1544
else
1545
{
1546
1547
num_segments = ImClamp ( num_segments, 3 , IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX ) ;
1548
1549
1550
const float a_max = ( IM_PI * 2.0f ) * ( ( float ) num_segments - 1.0f ) / ( float ) num_segments;
1551
PathArcTo ( center, radius - 0.5f , 0.0f , a_max, num_segments - 1 ) ;
1552
}
1553
1554
PathStroke ( col, ImDrawFlags_Closed, thickness ) ;
1555
}
1556
1557
void ImDrawList:: AddCircleFilled ( const ImVec2& center , float radius , ImU32 col , int num_segments )
1558
{
1559
if ( ( col & IM_COL32_A_MASK) == 0 || radius < 0.5f )
1560
return ;
1561
1562
if ( num_segments <= 0 )
1563
{
1564
1565
_PathArcToFastEx ( center, radius, 0 , IM_DRAWLIST_ARCFAST_SAMPLE_MAX, 0 ) ;
1566
_Path. Size - - ;
1567
}
1568
else
1569
{
1570
1571
num_segments = ImClamp ( num_segments, 3 , IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX ) ;
1572
1573
1574
const float a_max = ( IM_PI * 2.0f ) * ( ( float ) num_segments - 1.0f ) / ( float ) num_segments;
1575
PathArcTo ( center, radius, 0.0f , a_max, num_segments - 1 ) ;
1576
}
1577
1578
PathFillConvex ( col ) ;
1579
}
1580
1581
1582
void ImDrawList:: AddNgon ( const ImVec2& center , float radius , ImU32 col , int num_segments , float thickness )
1583
{
1584
if ( ( col & IM_COL32_A_MASK) == 0 || num_segments <= 2 )
1585
return ;
1586
1587
1588
const float a_max = ( IM_PI * 2.0f ) * ( ( float ) num_segments - 1.0f ) / ( float ) num_segments;
1589
PathArcTo ( center, radius - 0.5f , 0.0f , a_max, num_segments - 1 ) ;
1590
PathStroke ( col, ImDrawFlags_Closed, thickness ) ;
1591
}
1592
1593
1594
void ImDrawList:: AddNgonFilled ( const ImVec2& center , float radius , ImU32 col , int num_segments )
1595
{
1596
if ( ( col & IM_COL32_A_MASK) == 0 || num_segments <= 2 )
1597
return ;
1598
1599
1600
const float a_max = ( IM_PI * 2.0f ) * ( ( float ) num_segments - 1.0f ) / ( float ) num_segments;
1601
PathArcTo ( center, radius, 0.0f , a_max, num_segments - 1 ) ;
1602
PathFillConvex ( col ) ;
1603
}
1604
1605
1606
void ImDrawList:: AddEllipse ( const ImVec2& center , const ImVec2& radius , ImU32 col , float rot , int num_segments , float thickness )
1607
{
1608
if ( ( col & IM_COL32_A_MASK) == 0 )
1609
return ;
1610
1611
if ( num_segments <= 0 )
1612
num_segments = _CalcCircleAutoSegmentCount ( ImMax ( radius. x , radius. y ) ) ;
1613
1614
1615
const float a_max = IM_PI * 2.0f * ( ( float ) num_segments - 1.0f ) / ( float ) num_segments;
1616
PathEllipticalArcTo ( center, radius, rot, 0.0f , a_max, num_segments - 1 ) ;
1617
PathStroke ( col, true , thickness ) ;
1618
}
1619
1620
void ImDrawList:: AddEllipseFilled ( const ImVec2& center , const ImVec2& radius , ImU32 col , float rot , int num_segments )
1621
{
1622
if ( ( col & IM_COL32_A_MASK) == 0 )
1623
return ;
1624
1625
if ( num_segments <= 0 )
1626
num_segments = _CalcCircleAutoSegmentCount ( ImMax ( radius. x , radius. y ) ) ;
1627
1628
1629
const float a_max = IM_PI * 2.0f * ( ( float ) num_segments - 1.0f ) / ( float ) num_segments;
1630
PathEllipticalArcTo ( center, radius, rot, 0.0f , a_max, num_segments - 1 ) ;
1631
PathFillConvex ( col ) ;
1632
}
1633
1634
1635
void ImDrawList:: AddBezierCubic ( const ImVec2& p1 , const ImVec2& p2 , const ImVec2& p3 , const ImVec2& p4 , ImU32 col , float thickness , int num_segments )
1636
{
1637
if ( ( col & IM_COL32_A_MASK) == 0 )
1638
return ;
1639
1640
PathLineTo ( p1 ) ;
1641
PathBezierCubicCurveTo ( p2, p3, p4, num_segments ) ;
1642
PathStroke ( col, 0 , thickness ) ;
1643
}
1644
1645
1646
void ImDrawList:: AddBezierQuadratic ( const ImVec2& p1 , const ImVec2& p2 , const ImVec2& p3 , ImU32 col , float thickness , int num_segments )
1647
{
1648
if ( ( col & IM_COL32_A_MASK) == 0 )
1649
return ;
1650
1651
PathLineTo ( p1 ) ;
1652
PathBezierQuadraticCurveTo ( p2, p3, num_segments ) ;
1653
PathStroke ( col, 0 , thickness ) ;
1654
}
1655
1656
void ImDrawList:: AddText ( ImFont* font , float font_size , const ImVec2& pos , ImU32 col , const char * text_begin , const char * text_end , float wrap_width , const ImVec4* cpu_fine_clip_rect )
1657
{
1658
if ( ( col & IM_COL32_A_MASK) == 0 )
1659
return ;
1660
1661
1662
if ( text_begin == text_end || text_begin[ 0 ] == 0 )
1663
return ;
1664
if ( text_end == NULL )
1665
text_end = text_begin + strlen ( text_begin ) ;
1666
1667
1668
if ( font == NULL )
1669
font = _Data-> Font ;
1670
if ( font_size == 0.0f )
1671
font_size = _Data-> FontSize ;
1672
1673
IM_ASSERT ( font-> ContainerAtlas -> TexID == _CmdHeader. TextureId ) ;
1674
1675
ImVec4 clip_rect = _CmdHeader. ClipRect ;
1676
if ( cpu_fine_clip_rect)
1677
{
1678
clip_rect. x = ImMax ( clip_rect. x , cpu_fine_clip_rect-> x ) ;
1679
clip_rect. y = ImMax ( clip_rect. y , cpu_fine_clip_rect-> y ) ;
1680
clip_rect. z = ImMin ( clip_rect. z , cpu_fine_clip_rect-> z ) ;
1681
clip_rect. w = ImMin ( clip_rect. w , cpu_fine_clip_rect-> w ) ;
1682
}
1683
font-> RenderText ( this , font_size, pos, col, clip_rect, text_begin, text_end, wrap_width, cpu_fine_clip_rect != NULL ) ;
1684
}
1685
1686
void ImDrawList:: AddText ( const ImVec2& pos , ImU32 col , const char * text_begin , const char * text_end )
1687
{
1688
AddText ( NULL , 0.0f , pos, col, text_begin, text_end) ;
1689
}
1690
1691
void ImDrawList:: AddImage ( ImTextureID user_texture_id , const ImVec2& p_min , const ImVec2& p_max , const ImVec2& uv_min , const ImVec2& uv_max , ImU32 col )
1692
{
1693
if ( ( col & IM_COL32_A_MASK) == 0 )
1694
return ;
1695
1696
const bool push_texture_id = user_texture_id != _CmdHeader. TextureId ;
1697
if ( push_texture_id)
1698
PushTextureID ( user_texture_id ) ;
1699
1700
PrimReserve ( 6 , 4 ) ;
1701
PrimRectUV ( p_min, p_max, uv_min, uv_max, col ) ;
1702
1703
if ( push_texture_id)
1704
PopTextureID ( ) ;
1705
}
1706
1707
void ImDrawList:: AddImageQuad ( ImTextureID user_texture_id , const ImVec2& p1 , const ImVec2& p2 , const ImVec2& p3 , const ImVec2& p4 , const ImVec2& uv1 , const ImVec2& uv2 , const ImVec2& uv3 , const ImVec2& uv4 , ImU32 col )
1708
{
1709
if ( ( col & IM_COL32_A_MASK) == 0 )
1710
return ;
1711
1712
const bool push_texture_id = user_texture_id != _CmdHeader. TextureId ;
1713
if ( push_texture_id)
1714
PushTextureID ( user_texture_id ) ;
1715
1716
PrimReserve ( 6 , 4 ) ;
1717
PrimQuadUV ( p1, p2, p3, p4, uv1, uv2, uv3, uv4, col ) ;
1718
1719
if ( push_texture_id)
1720
PopTextureID ( ) ;
1721
}
1722
1723
void ImDrawList:: AddImageRounded ( ImTextureID user_texture_id , const ImVec2& p_min , const ImVec2& p_max , const ImVec2& uv_min , const ImVec2& uv_max , ImU32 col , float rounding , ImDrawFlags flags )
1724
{
1725
if ( ( col & IM_COL32_A_MASK) == 0 )
1726
return ;
1727
1728
flags = FixRectCornerFlags ( flags ) ;
1729
if ( rounding < 0.5f || ( flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone)
1730
{
1731
AddImage ( user_texture_id, p_min, p_max, uv_min, uv_max, col ) ;
1732
return ;
1733
}
1734
1735
const bool push_texture_id = user_texture_id != _CmdHeader. TextureId ;
1736
if ( push_texture_id)
1737
PushTextureID ( user_texture_id ) ;
1738
1739
int vert_start_idx = VtxBuffer. Size ;
1740
PathRect ( p_min, p_max, rounding, flags ) ;
1741
PathFillConvex ( col ) ;
1742
int vert_end_idx = VtxBuffer. Size ;
1743
ImGui:: ShadeVertsLinearUV ( this , vert_start_idx, vert_end_idx, p_min, p_max, uv_min, uv_max, true ) ;
1744
1745
if ( push_texture_id)
1746
PopTextureID ( ) ;
1747
}
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
enum ImTriangulatorNodeType
1761
{
1762
ImTriangulatorNodeType_Convex,
1763
ImTriangulatorNodeType_Ear,
1764
ImTriangulatorNodeType_Reflex
1765
} ;
1766
1767
struct ImTriangulatorNode
1768
{
1769
ImTriangulatorNodeType Type;
1770
int Index;
1771
ImVec2 Pos;
1772
ImTriangulatorNode* Next;
1773
ImTriangulatorNode* Prev;
1774
1775
void Unlink ( ) { Next-> Prev = Prev; Prev-> Next = Next; }
1776
} ;
1777
1778
struct ImTriangulatorNodeSpan
1779
{
1780
ImTriangulatorNode* * Data = NULL ;
1781
int Size = 0 ;
1782
1783
void push_back ( ImTriangulatorNode* node ) { Data[ Size + + ] = node; }
1784
void find_erase_unsorted ( int idx ) { for ( int i = Size - 1 ; i >= 0 ; i- - ) if ( Data[ i] -> Index == idx) { Data[ i] = Data[ Size - 1 ] ; Size - - ; return ; } }
1785
} ;
1786
1787
struct ImTriangulator
1788
{
1789
static int EstimateTriangleCount ( int points_count ) { return ( points_count < 3 ) ? 0 : points_count - 2 ; }
1790
static int EstimateScratchBufferSize ( int points_count ) { return sizeof ( ImTriangulatorNode ) * points_count + sizeof ( ImTriangulatorNode* ) * points_count * 2 ; }
1791
1792
void Init ( const ImVec2* points , int points_count , void * scratch_buffer ) ;
1793
void GetNextTriangle ( unsigned int out_triangle [ 3 ] ) ;
1794
1795
1796
void BuildNodes ( const ImVec2* points , int points_count ) ;
1797
void BuildReflexes ( ) ;
1798
void BuildEars ( ) ;
1799
void FlipNodeList ( ) ;
1800
bool IsEar ( int i0 , int i1 , int i2 , const ImVec2& v0 , const ImVec2& v1 , const ImVec2& v2 ) const ;
1801
void ReclassifyNode ( ImTriangulatorNode* node ) ;
1802
1803
1804
int _TrianglesLeft = 0 ;
1805
ImTriangulatorNode* _Nodes = NULL ;
1806
ImTriangulatorNodeSpan _Ears;
1807
ImTriangulatorNodeSpan _Reflexes;
1808
} ;
1809
1810
1811
1812
1813
void ImTriangulator:: Init ( const ImVec2* points , int points_count , void * scratch_buffer )
1814
{
1815
IM_ASSERT ( scratch_buffer != NULL && points_count >= 3 ) ;
1816
_TrianglesLeft = EstimateTriangleCount ( points_count ) ;
1817
_Nodes = ( ImTriangulatorNode* ) scratch_buffer;
1818
_Ears. Data = ( ImTriangulatorNode* * ) ( _Nodes + points_count) ;
1819
_Reflexes. Data = ( ImTriangulatorNode* * ) ( _Nodes + points_count) + points_count;
1820
BuildNodes ( points, points_count ) ;
1821
BuildReflexes ( ) ;
1822
BuildEars ( ) ;
1823
}
1824
1825
void ImTriangulator:: BuildNodes ( const ImVec2* points , int points_count )
1826
{
1827
for ( int i = 0 ; i < points_count; i+ + )
1828
{
1829
_Nodes[ i] . Type = ImTriangulatorNodeType_Convex;
1830
_Nodes[ i] . Index = i;
1831
_Nodes[ i] . Pos = points[ i] ;
1832
_Nodes[ i] . Next = _Nodes + i + 1 ;
1833
_Nodes[ i] . Prev = _Nodes + i - 1 ;
1834
}
1835
_Nodes[ 0 ] . Prev = _Nodes + points_count - 1 ;
1836
_Nodes[ points_count - 1 ] . Next = _Nodes;
1837
}
1838
1839
void ImTriangulator:: BuildReflexes ( )
1840
{
1841
ImTriangulatorNode* n1 = _Nodes;
1842
for ( int i = _TrianglesLeft; i >= 0 ; i- - , n1 = n1-> Next )
1843
{
1844
if ( ImTriangleIsClockwise ( n1-> Prev -> Pos , n1-> Pos , n1-> Next -> Pos ) )
1845
continue ;
1846
n1-> Type = ImTriangulatorNodeType_Reflex;
1847
_Reflexes. push_back ( n1 ) ;
1848
}
1849
}
1850
1851
void ImTriangulator:: BuildEars ( )
1852
{
1853
ImTriangulatorNode* n1 = _Nodes;
1854
for ( int i = _TrianglesLeft; i >= 0 ; i- - , n1 = n1-> Next )
1855
{
1856
if ( n1-> Type != ImTriangulatorNodeType_Convex)
1857
continue ;
1858
if ( ! IsEar ( n1-> Prev -> Index , n1-> Index , n1-> Next -> Index , n1-> Prev -> Pos , n1-> Pos , n1-> Next -> Pos ) )
1859
continue ;
1860
n1-> Type = ImTriangulatorNodeType_Ear;
1861
_Ears. push_back ( n1 ) ;
1862
}
1863
}
1864
1865
void ImTriangulator:: GetNextTriangle ( unsigned int out_triangle [ 3 ] )
1866
{
1867
if ( _Ears. Size == 0 )
1868
{
1869
FlipNodeList ( ) ;
1870
1871
ImTriangulatorNode* node = _Nodes;
1872
for ( int i = _TrianglesLeft; i >= 0 ; i- - , node = node-> Next )
1873
node-> Type = ImTriangulatorNodeType_Convex;
1874
_Reflexes. Size = 0 ;
1875
BuildReflexes ( ) ;
1876
BuildEars ( ) ;
1877
1878
1879
if ( _Ears. Size == 0 )
1880
{
1881
1882
IM_ASSERT ( _TrianglesLeft > 0 ) ;
1883
_Ears. Data [ 0 ] = _Nodes;
1884
_Ears. Size = 1 ;
1885
}
1886
}
1887
1888
ImTriangulatorNode* ear = _Ears. Data [ - - _Ears. Size ] ;
1889
out_triangle[ 0 ] = ear-> Prev -> Index ;
1890
out_triangle[ 1 ] = ear-> Index ;
1891
out_triangle[ 2 ] = ear-> Next -> Index ;
1892
1893
ear-> Unlink ( ) ;
1894
if ( ear == _Nodes)
1895
_Nodes = ear-> Next ;
1896
1897
ReclassifyNode ( ear-> Prev ) ;
1898
ReclassifyNode ( ear-> Next ) ;
1899
_TrianglesLeft- - ;
1900
}
1901
1902
void ImTriangulator:: FlipNodeList ( )
1903
{
1904
ImTriangulatorNode* prev = _Nodes;
1905
ImTriangulatorNode* temp = _Nodes;
1906
ImTriangulatorNode* current = _Nodes-> Next ;
1907
prev-> Next = prev;
1908
prev-> Prev = prev;
1909
while ( current != _Nodes)
1910
{
1911
temp = current-> Next ;
1912
1913
current-> Next = prev;
1914
prev-> Prev = current;
1915
_Nodes-> Next = current;
1916
current-> Prev = _Nodes;
1917
1918
prev = current;
1919
current = temp;
1920
}
1921
_Nodes = prev;
1922
}
1923
1924
1925
bool ImTriangulator:: IsEar ( int i0 , int i1 , int i2 , const ImVec2& v0 , const ImVec2& v1 , const ImVec2& v2 ) const
1926
{
1927
ImTriangulatorNode* * p_end = _Reflexes. Data + _Reflexes. Size ;
1928
for ( ImTriangulatorNode* * p = _Reflexes. Data ; p < p_end; p+ + )
1929
{
1930
ImTriangulatorNode* reflex = * p;
1931
if ( reflex-> Index != i0 && reflex-> Index != i1 && reflex-> Index != i2)
1932
if ( ImTriangleContainsPoint ( v0, v1, v2, reflex-> Pos ) )
1933
return false ;
1934
}
1935
return true ;
1936
}
1937
1938
void ImTriangulator:: ReclassifyNode ( ImTriangulatorNode* n1 )
1939
{
1940
1941
ImTriangulatorNodeType type;
1942
const ImTriangulatorNode* n0 = n1-> Prev ;
1943
const ImTriangulatorNode* n2 = n1-> Next ;
1944
if ( ! ImTriangleIsClockwise ( n0-> Pos , n1-> Pos , n2-> Pos ) )
1945
type = ImTriangulatorNodeType_Reflex;
1946
else if ( IsEar ( n0-> Index , n1-> Index , n2-> Index , n0-> Pos , n1-> Pos , n2-> Pos ) )
1947
type = ImTriangulatorNodeType_Ear;
1948
else
1949
type = ImTriangulatorNodeType_Convex;
1950
1951
1952
if ( type == n1-> Type )
1953
return ;
1954
if ( n1-> Type == ImTriangulatorNodeType_Reflex)
1955
_Reflexes. find_erase_unsorted ( n1-> Index ) ;
1956
else if ( n1-> Type == ImTriangulatorNodeType_Ear)
1957
_Ears. find_erase_unsorted ( n1-> Index ) ;
1958
if ( type == ImTriangulatorNodeType_Reflex)
1959
_Reflexes. push_back ( n1 ) ;
1960
else if ( type == ImTriangulatorNodeType_Ear)
1961
_Ears. push_back ( n1 ) ;
1962
n1-> Type = type;
1963
}
1964
1965
1966
1967
1968
1969
1970
void ImDrawList:: AddConcavePolyFilled ( const ImVec2* points , const int points_count , ImU32 col )
1971
{
1972
if ( points_count < 3 || ( col & IM_COL32_A_MASK) == 0 )
1973
return ;
1974
1975
const ImVec2 uv = _Data-> TexUvWhitePixel ;
1976
ImTriangulator triangulator;
1977
unsigned int triangle[ 3 ] ;
1978
if ( Flags & ImDrawListFlags_AntiAliasedFill)
1979
{
1980
1981
const float AA_SIZE = _FringeScale;
1982
const ImU32 col_trans = col & ~ IM_COL32_A_MASK;
1983
const int idx_count = ( points_count - 2 ) * 3 + points_count * 6 ;
1984
const int vtx_count = ( points_count * 2 ) ;
1985
PrimReserve ( idx_count, vtx_count ) ;
1986
1987
1988
unsigned int vtx_inner_idx = _VtxCurrentIdx;
1989
unsigned int vtx_outer_idx = _VtxCurrentIdx + 1 ;
1990
1991
_Data-> TempBuffer . reserve_discard ( ( ImTriangulator:: EstimateScratchBufferSize ( points_count ) + sizeof ( ImVec2 ) ) / sizeof ( ImVec2 ) ) ;
1992
triangulator. Init ( points, points_count, _Data-> TempBuffer . Data ) ;
1993
while ( triangulator. _TrianglesLeft > 0 )
1994
{
1995
triangulator. GetNextTriangle ( triangle ) ;
1996
_IdxWritePtr[ 0 ] = ( ImDrawIdx) ( vtx_inner_idx + ( triangle[ 0 ] << 1 ) ) ; _IdxWritePtr[ 1 ] = ( ImDrawIdx) ( vtx_inner_idx + ( triangle[ 1 ] << 1 ) ) ; _IdxWritePtr[ 2 ] = ( ImDrawIdx) ( vtx_inner_idx + ( triangle[ 2 ] << 1 ) ) ;
1997
_IdxWritePtr += 3 ;
1998
}
1999
2000
2001
_Data-> TempBuffer . reserve_discard ( points_count ) ;
2002
ImVec2* temp_normals = _Data-> TempBuffer . Data ;
2003
for ( int i0 = points_count - 1 , i1 = 0 ; i1 < points_count; i0 = i1+ + )
2004
{
2005
const ImVec2& p0 = points[ i0] ;
2006
const ImVec2& p1 = points[ i1] ;
2007
float dx = p1. x - p0. x ;
2008
float dy = p1. y - p0. y ;
2009
IM_NORMALIZE2F_OVER_ZERO ( dx, dy ) ;
2010
temp_normals[ i0] . x = dy;
2011
temp_normals[ i0] . y = - dx;
2012
}
2013
2014
for ( int i0 = points_count - 1 , i1 = 0 ; i1 < points_count; i0 = i1+ + )
2015
{
2016
2017
const ImVec2& n0 = temp_normals[ i0] ;
2018
const ImVec2& n1 = temp_normals[ i1] ;
2019
float dm_x = ( n0. x + n1. x ) * 0.5f ;
2020
float dm_y = ( n0. y + n1. y ) * 0.5f ;
2021
IM_FIXNORMAL2F ( dm_x, dm_y ) ;
2022
dm_x *= AA_SIZE * 0.5f ;
2023
dm_y *= AA_SIZE * 0.5f ;
2024
2025
2026
_VtxWritePtr[ 0 ] . pos . x = ( points[ i1] . x - dm_x) ; _VtxWritePtr[ 0 ] . pos . y = ( points[ i1] . y - dm_y) ; _VtxWritePtr[ 0 ] . uv = uv; _VtxWritePtr[ 0 ] . col = col;
2027
_VtxWritePtr[ 1 ] . pos . x = ( points[ i1] . x + dm_x) ; _VtxWritePtr[ 1 ] . pos . y = ( points[ i1] . y + dm_y) ; _VtxWritePtr[ 1 ] . uv = uv; _VtxWritePtr[ 1 ] . col = col_trans;
2028
_VtxWritePtr += 2 ;
2029
2030
2031
_IdxWritePtr[ 0 ] = ( ImDrawIdx) ( vtx_inner_idx + ( i1 << 1 ) ) ; _IdxWritePtr[ 1 ] = ( ImDrawIdx) ( vtx_inner_idx + ( i0 << 1 ) ) ; _IdxWritePtr[ 2 ] = ( ImDrawIdx) ( vtx_outer_idx + ( i0 << 1 ) ) ;
2032
_IdxWritePtr[ 3 ] = ( ImDrawIdx) ( vtx_outer_idx + ( i0 << 1 ) ) ; _IdxWritePtr[ 4 ] = ( ImDrawIdx) ( vtx_outer_idx + ( i1 << 1 ) ) ; _IdxWritePtr[ 5 ] = ( ImDrawIdx) ( vtx_inner_idx + ( i1 << 1 ) ) ;
2033
_IdxWritePtr += 6 ;
2034
}
2035
_VtxCurrentIdx += ( ImDrawIdx) vtx_count;
2036
}
2037
else
2038
{
2039
2040
const int idx_count = ( points_count - 2 ) * 3 ;
2041
const int vtx_count = points_count;
2042
PrimReserve ( idx_count, vtx_count ) ;
2043
for ( int i = 0 ; i < vtx_count; i+ + )
2044
{
2045
_VtxWritePtr[ 0 ] . pos = points[ i] ; _VtxWritePtr[ 0 ] . uv = uv; _VtxWritePtr[ 0 ] . col = col;
2046
_VtxWritePtr+ + ;
2047
}
2048
_Data-> TempBuffer . reserve_discard ( ( ImTriangulator:: EstimateScratchBufferSize ( points_count ) + sizeof ( ImVec2 ) ) / sizeof ( ImVec2 ) ) ;
2049
triangulator. Init ( points, points_count, _Data-> TempBuffer . Data ) ;
2050
while ( triangulator. _TrianglesLeft > 0 )
2051
{
2052
triangulator. GetNextTriangle ( triangle ) ;
2053
_IdxWritePtr[ 0 ] = ( ImDrawIdx) ( _VtxCurrentIdx + triangle[ 0 ] ) ; _IdxWritePtr[ 1 ] = ( ImDrawIdx) ( _VtxCurrentIdx + triangle[ 1 ] ) ; _IdxWritePtr[ 2 ] = ( ImDrawIdx) ( _VtxCurrentIdx + triangle[ 2 ] ) ;
2054
_IdxWritePtr += 3 ;
2055
}
2056
_VtxCurrentIdx += ( ImDrawIdx) vtx_count;
2057
}
2058
}
2059
2060
2061
2062
2063
2064
2065
2066
void ImDrawListSplitter:: ClearFreeMemory ( )
2067
{
2068
for ( int i = 0 ; i < _Channels. Size ; i+ + )
2069
{
2070
if ( i == _Current)
2071
memset ( & _Channels[ i] , 0 , sizeof ( _Channels[ i] ) ) ;
2072
_Channels[ i] . _CmdBuffer . clear ( ) ;
2073
_Channels[ i] . _IdxBuffer . clear ( ) ;
2074
}
2075
_Current = 0 ;
2076
_Count = 1 ;
2077
_Channels. clear ( ) ;
2078
}
2079
2080
void ImDrawListSplitter:: Split ( ImDrawList* draw_list , int channels_count )
2081
{
2082
IM_UNUSED ( draw_list ) ;
2083
IM_ASSERT ( _Current == 0 && _Count <= 1 && " Nested channel splitting is not supported. Please use separate instances of ImDrawListSplitter." ) ;
2084
int old_channels_count = _Channels. Size ;
2085
if ( old_channels_count < channels_count)
2086
{
2087
_Channels. reserve ( channels_count ) ;
2088
_Channels. resize ( channels_count ) ;
2089
}
2090
_Count = channels_count;
2091
2092
2093
2094
2095
memset ( & _Channels[ 0 ] , 0 , sizeof ( ImDrawChannel ) ) ;
2096
for ( int i = 1 ; i < channels_count; i+ + )
2097
{
2098
if ( i >= old_channels_count)
2099
{
2100
IM_PLACEMENT_NEW ( & _Channels[ i] ) ImDrawChannel ( ) ;
2101
}
2102
else
2103
{
2104
_Channels[ i] . _CmdBuffer . resize ( 0 ) ;
2105
_Channels[ i] . _IdxBuffer . resize ( 0 ) ;
2106
}
2107
}
2108
}
2109
2110
void ImDrawListSplitter:: Merge ( ImDrawList* draw_list )
2111
{
2112
2113
if ( _Count <= 1 )
2114
return ;
2115
2116
SetCurrentChannel ( draw_list, 0 ) ;
2117
draw_list-> _PopUnusedDrawCmd ( ) ;
2118
2119
2120
int new_cmd_buffer_count = 0 ;
2121
int new_idx_buffer_count = 0 ;
2122
ImDrawCmd* last_cmd = ( _Count > 0 && draw_list-> CmdBuffer . Size > 0 ) ? & draw_list-> CmdBuffer . back ( ) : NULL ;
2123
int idx_offset = last_cmd ? last_cmd-> IdxOffset + last_cmd-> ElemCount : 0 ;
2124
for ( int i = 1 ; i < _Count; i+ + )
2125
{
2126
ImDrawChannel& ch = _Channels[ i] ;
2127
if ( ch. _CmdBuffer . Size > 0 && ch. _CmdBuffer . back ( ) . ElemCount == 0 && ch. _CmdBuffer . back ( ) . UserCallback == NULL )
2128
ch. _CmdBuffer . pop_back ( ) ;
2129
2130
if ( ch. _CmdBuffer . Size > 0 && last_cmd != NULL )
2131
{
2132
2133
2134
ImDrawCmd* next_cmd = & ch. _CmdBuffer [ 0 ] ;
2135
if ( ImDrawCmd_HeaderCompare ( last_cmd, next_cmd ) == 0 && last_cmd-> UserCallback == NULL && next_cmd-> UserCallback == NULL )
2136
{
2137
2138
last_cmd-> ElemCount += next_cmd-> ElemCount ;
2139
idx_offset += next_cmd-> ElemCount ;
2140
ch. _CmdBuffer . erase ( ch. _CmdBuffer . Data ) ;
2141
}
2142
}
2143
if ( ch. _CmdBuffer . Size > 0 )
2144
last_cmd = & ch. _CmdBuffer . back ( ) ;
2145
new_cmd_buffer_count += ch. _CmdBuffer . Size ;
2146
new_idx_buffer_count += ch. _IdxBuffer . Size ;
2147
for ( int cmd_n = 0 ; cmd_n < ch. _CmdBuffer . Size ; cmd_n+ + )
2148
{
2149
ch. _CmdBuffer . Data [ cmd_n] . IdxOffset = idx_offset;
2150
idx_offset += ch. _CmdBuffer . Data [ cmd_n] . ElemCount ;
2151
}
2152
}
2153
draw_list-> CmdBuffer . resize ( draw_list-> CmdBuffer . Size + new_cmd_buffer_count ) ;
2154
draw_list-> IdxBuffer . resize ( draw_list-> IdxBuffer . Size + new_idx_buffer_count ) ;
2155
2156
2157
ImDrawCmd* cmd_write = draw_list-> CmdBuffer . Data + draw_list-> CmdBuffer . Size - new_cmd_buffer_count;
2158
ImDrawIdx* idx_write = draw_list-> IdxBuffer . Data + draw_list-> IdxBuffer . Size - new_idx_buffer_count;
2159
for ( int i = 1 ; i < _Count; i+ + )
2160
{
2161
ImDrawChannel& ch = _Channels[ i] ;
2162
if ( int sz = ch. _CmdBuffer . Size ) { memcpy ( cmd_write, ch. _CmdBuffer . Data , sz * sizeof ( ImDrawCmd ) ) ; cmd_write += sz; }
2163
if ( int sz = ch. _IdxBuffer . Size ) { memcpy ( idx_write, ch. _IdxBuffer . Data , sz * sizeof ( ImDrawIdx ) ) ; idx_write += sz; }
2164
}
2165
draw_list-> _IdxWritePtr = idx_write;
2166
2167
2168
if ( draw_list-> CmdBuffer . Size == 0 || draw_list-> CmdBuffer . back ( ) . UserCallback != NULL )
2169
draw_list-> AddDrawCmd ( ) ;
2170
2171
2172
ImDrawCmd* curr_cmd = & draw_list-> CmdBuffer . Data [ draw_list-> CmdBuffer . Size - 1 ] ;
2173
if ( curr_cmd-> ElemCount == 0 )
2174
ImDrawCmd_HeaderCopy ( curr_cmd, & draw_list-> _CmdHeader ) ;
2175
else if ( ImDrawCmd_HeaderCompare ( curr_cmd, & draw_list-> _CmdHeader ) != 0 )
2176
draw_list-> AddDrawCmd ( ) ;
2177
2178
_Count = 1 ;
2179
}
2180
2181
void ImDrawListSplitter:: SetCurrentChannel ( ImDrawList* draw_list , int idx )
2182
{
2183
IM_ASSERT ( idx >= 0 && idx < _Count ) ;
2184
if ( _Current == idx)
2185
return ;
2186
2187
2188
memcpy ( & _Channels. Data [ _Current] . _CmdBuffer , & draw_list-> CmdBuffer , sizeof ( draw_list-> CmdBuffer ) ) ;
2189
memcpy ( & _Channels. Data [ _Current] . _IdxBuffer , & draw_list-> IdxBuffer , sizeof ( draw_list-> IdxBuffer ) ) ;
2190
_Current = idx;
2191
memcpy ( & draw_list-> CmdBuffer , & _Channels. Data [ idx] . _CmdBuffer , sizeof ( draw_list-> CmdBuffer ) ) ;
2192
memcpy ( & draw_list-> IdxBuffer , & _Channels. Data [ idx] . _IdxBuffer , sizeof ( draw_list-> IdxBuffer ) ) ;
2193
draw_list-> _IdxWritePtr = draw_list-> IdxBuffer . Data + draw_list-> IdxBuffer . Size ;
2194
2195
2196
ImDrawCmd* curr_cmd = ( draw_list-> CmdBuffer . Size == 0 ) ? NULL : & draw_list-> CmdBuffer . Data [ draw_list-> CmdBuffer . Size - 1 ] ;
2197
if ( curr_cmd == NULL )
2198
draw_list-> AddDrawCmd ( ) ;
2199
else if ( curr_cmd-> ElemCount == 0 )
2200
ImDrawCmd_HeaderCopy ( curr_cmd, & draw_list-> _CmdHeader ) ;
2201
else if ( ImDrawCmd_HeaderCompare ( curr_cmd, & draw_list-> _CmdHeader ) != 0 )
2202
draw_list-> AddDrawCmd ( ) ;
2203
}
2204
2205
2206
2207
2208
2209
void ImDrawData:: Clear ( )
2210
{
2211
Valid = false ;
2212
CmdListsCount = TotalIdxCount = TotalVtxCount = 0 ;
2213
CmdLists. resize ( 0 ) ;
2214
DisplayPos = DisplaySize = FramebufferScale = ImVec2 ( 0.0f , 0.0f ) ;
2215
OwnerViewport = NULL ;
2216
}
2217
2218
2219
2220
void ImGui:: AddDrawListToDrawDataEx ( ImDrawData* draw_data , ImVector< ImDrawList* > * out_list , ImDrawList* draw_list )
2221
{
2222
if ( draw_list-> CmdBuffer . Size == 0 )
2223
return ;
2224
if ( draw_list-> CmdBuffer . Size == 1 && draw_list-> CmdBuffer [ 0 ] . ElemCount == 0 && draw_list-> CmdBuffer [ 0 ] . UserCallback == NULL )
2225
return ;
2226
2227
2228
2229
IM_ASSERT ( draw_list-> VtxBuffer . Size == 0 || draw_list-> _VtxWritePtr == draw_list-> VtxBuffer . Data + draw_list-> VtxBuffer . Size ) ;
2230
IM_ASSERT ( draw_list-> IdxBuffer . Size == 0 || draw_list-> _IdxWritePtr == draw_list-> IdxBuffer . Data + draw_list-> IdxBuffer . Size ) ;
2231
if ( ! ( draw_list-> Flags & ImDrawListFlags_AllowVtxOffset) )
2232
IM_ASSERT ( ( int ) draw_list-> _VtxCurrentIdx == draw_list-> VtxBuffer . Size ) ;
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
if ( sizeof ( ImDrawIdx ) == 2 )
2250
IM_ASSERT ( draw_list-> _VtxCurrentIdx < ( 1 << 16 ) && " Too many vertices in ImDrawList using 16-bit indices. Read comment above" ) ;
2251
2252
2253
if ( draw_list-> _CallbacksDataBuf . Size > 0 )
2254
for ( ImDrawCmd& cmd : draw_list-> CmdBuffer )
2255
if ( cmd. UserCallback != NULL && cmd. UserCallbackDataOffset != - 1 && cmd. UserCallbackDataSize > 0 )
2256
cmd. UserCallbackData = draw_list-> _CallbacksDataBuf . Data + cmd. UserCallbackDataOffset ;
2257
2258
2259
out_list-> push_back ( draw_list ) ;
2260
draw_data-> CmdListsCount + + ;
2261
draw_data-> TotalVtxCount += draw_list-> VtxBuffer . Size ;
2262
draw_data-> TotalIdxCount += draw_list-> IdxBuffer . Size ;
2263
}
2264
2265
void ImDrawData:: AddDrawList ( ImDrawList* draw_list )
2266
{
2267
IM_ASSERT ( CmdLists. Size == CmdListsCount ) ;
2268
draw_list-> _PopUnusedDrawCmd ( ) ;
2269
ImGui:: AddDrawListToDrawDataEx ( this , & CmdLists, draw_list) ;
2270
}
2271
2272
2273
void ImDrawData:: DeIndexAllBuffers ( )
2274
{
2275
ImVector< ImDrawVert> new_vtx_buffer;
2276
TotalVtxCount = TotalIdxCount = 0 ;
2277
for ( int i = 0 ; i < CmdListsCount; i+ + )
2278
{
2279
ImDrawList* cmd_list = CmdLists[ i] ;
2280
if ( cmd_list-> IdxBuffer . empty ( ) )
2281
continue ;
2282
new_vtx_buffer. resize ( cmd_list-> IdxBuffer . Size ) ;
2283
for ( int j = 0 ; j < cmd_list-> IdxBuffer . Size ; j+ + )
2284
new_vtx_buffer[ j] = cmd_list-> VtxBuffer [ cmd_list-> IdxBuffer [ j] ] ;
2285
cmd_list-> VtxBuffer . swap ( new_vtx_buffer ) ;
2286
cmd_list-> IdxBuffer . resize ( 0 ) ;
2287
TotalVtxCount += cmd_list-> VtxBuffer . Size ;
2288
}
2289
}
2290
2291
2292
2293
2294
void ImDrawData:: ScaleClipRects ( const ImVec2& fb_scale )
2295
{
2296
for ( ImDrawList* draw_list : CmdLists)
2297
for ( ImDrawCmd& cmd : draw_list-> CmdBuffer )
2298
cmd. ClipRect = ImVec4 ( cmd. ClipRect . x * fb_scale. x , cmd. ClipRect . y * fb_scale. y , cmd. ClipRect . z * fb_scale. x , cmd. ClipRect . w * fb_scale. y ) ;
2299
}
2300
2301
2302
2303
2304
2305
2306
void ImGui:: ShadeVertsLinearColorGradientKeepAlpha ( ImDrawList* draw_list , int vert_start_idx , int vert_end_idx , ImVec2 gradient_p0 , ImVec2 gradient_p1 , ImU32 col0 , ImU32 col1 )
2307
{
2308
ImVec2 gradient_extent = gradient_p1 - gradient_p0;
2309
float gradient_inv_length2 = 1.0f / ImLengthSqr ( gradient_extent ) ;
2310
ImDrawVert* vert_start = draw_list-> VtxBuffer . Data + vert_start_idx;
2311
ImDrawVert* vert_end = draw_list-> VtxBuffer . Data + vert_end_idx;
2312
const int col0_r = ( int ) ( col0 >> IM_COL32_R_SHIFT) & 0xFF ;
2313
const int col0_g = ( int ) ( col0 >> IM_COL32_G_SHIFT) & 0xFF ;
2314
const int col0_b = ( int ) ( col0 >> IM_COL32_B_SHIFT) & 0xFF ;
2315
const int col_delta_r = ( ( int ) ( col1 >> IM_COL32_R_SHIFT) & 0xFF ) - col0_r;
2316
const int col_delta_g = ( ( int ) ( col1 >> IM_COL32_G_SHIFT) & 0xFF ) - col0_g;
2317
const int col_delta_b = ( ( int ) ( col1 >> IM_COL32_B_SHIFT) & 0xFF ) - col0_b;
2318
for ( ImDrawVert* vert = vert_start; vert < vert_end; vert+ + )
2319
{
2320
float d = ImDot ( vert-> pos - gradient_p0, gradient_extent ) ;
2321
float t = ImClamp ( d * gradient_inv_length2, 0.0f , 1.0f ) ;
2322
int r = ( int ) ( col0_r + col_delta_r * t) ;
2323
int g = ( int ) ( col0_g + col_delta_g * t) ;
2324
int b = ( int ) ( col0_b + col_delta_b * t) ;
2325
vert-> col = ( r << IM_COL32_R_SHIFT) | ( g << IM_COL32_G_SHIFT) | ( b << IM_COL32_B_SHIFT) | ( vert-> col & IM_COL32_A_MASK) ;
2326
}
2327
}
2328
2329
2330
void ImGui:: ShadeVertsLinearUV ( ImDrawList* draw_list , int vert_start_idx , int vert_end_idx , const ImVec2& a , const ImVec2& b , const ImVec2& uv_a , const ImVec2& uv_b , bool clamp )
2331
{
2332
const ImVec2 size = b - a;
2333
const ImVec2 uv_size = uv_b - uv_a;
2334
const ImVec2 scale = ImVec2 (
2335
size. x != 0.0f ? ( uv_size. x / size. x ) : 0.0f ,
2336
size. y != 0.0f ? ( uv_size. y / size. y ) : 0.0f ) ;
2337
2338
ImDrawVert* vert_start = draw_list-> VtxBuffer . Data + vert_start_idx;
2339
ImDrawVert* vert_end = draw_list-> VtxBuffer . Data + vert_end_idx;
2340
if ( clamp)
2341
{
2342
const ImVec2 min = ImMin ( uv_a, uv_b ) ;
2343
const ImVec2 max = ImMax ( uv_a, uv_b ) ;
2344
for ( ImDrawVert* vertex = vert_start; vertex < vert_end; + + vertex)
2345
vertex-> uv = ImClamp ( uv_a + ImMul ( ImVec2 ( vertex-> pos . x , vertex-> pos . y ) - a, scale) , min, max ) ;
2346
}
2347
else
2348
{
2349
for ( ImDrawVert* vertex = vert_start; vertex < vert_end; + + vertex)
2350
vertex-> uv = uv_a + ImMul ( ImVec2 ( vertex-> pos . x , vertex-> pos . y ) - a, scale) ;
2351
}
2352
}
2353
2354
void ImGui:: ShadeVertsTransformPos ( ImDrawList* draw_list , int vert_start_idx , int vert_end_idx , const ImVec2& pivot_in , float cos_a , float sin_a , const ImVec2& pivot_out )
2355
{
2356
ImDrawVert* vert_start = draw_list-> VtxBuffer . Data + vert_start_idx;
2357
ImDrawVert* vert_end = draw_list-> VtxBuffer . Data + vert_end_idx;
2358
for ( ImDrawVert* vertex = vert_start; vertex < vert_end; + + vertex)
2359
vertex-> pos = ImRotate ( vertex-> pos - pivot_in, cos_a, sin_a ) + pivot_out;
2360
}
2361
2362
2363
2364
2365
2366
ImFontConfig:: ImFontConfig ( )
2367
{
2368
memset ( this , 0 , sizeof ( * this ) ) ;
2369
FontDataOwnedByAtlas = true ;
2370
OversampleH = 2 ;
2371
OversampleV = 1 ;
2372
GlyphMaxAdvanceX = FLT_MAX;
2373
RasterizerMultiply = 1.0f ;
2374
RasterizerDensity = 1.0f ;
2375
EllipsisChar = ( ImWchar) - 1 ;
2376
}
2377
2378
2379
2380
2381
2382
2383
2384
2385
const int FONT_ATLAS_DEFAULT_TEX_DATA_W = 122 ;
2386
const int FONT_ATLAS_DEFAULT_TEX_DATA_H = 27 ;
2387
static const char FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS[ FONT_ATLAS_DEFAULT_TEX_DATA_W * FONT_ATLAS_DEFAULT_TEX_DATA_H + 1 ] =
2388
{
2389
" ..- -XXXXXXX- X - X -XXXXXXX - XXXXXXX- XX - XX XX "
2390
" ..- -X.....X- X.X - X.X -X.....X - X.....X- X..X -X..X X..X"
2391
" --- -XXX.XXX- X...X - X...X -X....X - X....X- X..X -X...X X...X"
2392
" X - X.X - X.....X - X.....X -X...X - X...X- X..X - X...X X...X "
2393
" XX - X.X -X.......X- X.......X -X..X.X - X.X..X- X..X - X...X...X "
2394
" X.X - X.X -XXXX.XXXX- XXXX.XXXX -X.X X.X - X.X X.X- X..XXX - X.....X "
2395
" X..X - X.X - X.X - X.X -XX X.X - X.X XX- X..X..XXX - X...X "
2396
" X...X - X.X - X.X - XX X.X XX - X.X - X.X - X..X..X..XX - X.X "
2397
" X....X - X.X - X.X - X.X X.X X.X - X.X - X.X - X..X..X..X.X - X...X "
2398
" X.....X - X.X - X.X - X..X X.X X..X - X.X - X.X -XXX X..X..X..X..X- X.....X "
2399
" X......X - X.X - X.X - X...XXXXXX.XXXXXX...X - X.X XX-XX X.X -X..XX........X..X- X...X...X "
2400
" X.......X - X.X - X.X -X.....................X- X.X X.X-X.X X.X -X...X...........X- X...X X...X "
2401
" X........X - X.X - X.X - X...XXXXXX.XXXXXX...X - X.X..X-X..X.X - X..............X-X...X X...X"
2402
" X.........X -XXX.XXX- X.X - X..X X.X X..X - X...X-X...X - X.............X-X..X X..X"
2403
" X..........X-X.....X- X.X - X.X X.X X.X - X....X-X....X - X.............X- XX XX "
2404
" X......XXXXX-XXXXXXX- X.X - XX X.X XX - X.....X-X.....X - X............X--------------"
2405
" X...X..X --------- X.X - X.X - XXXXXXX-XXXXXXX - X...........X - "
2406
" X..X X..X - -XXXX.XXXX- XXXX.XXXX ------------------------------------- X..........X - "
2407
" X.X X..X - -X.......X- X.......X - XX XX - - X..........X - "
2408
" XX X..X - - X.....X - X.....X - X.X X.X - - X........X - "
2409
" X..X - - X...X - X...X - X..X X..X - - X........X - "
2410
" XX - - X.X - X.X - X...XXXXXXXXXXXXX...X - - XXXXXXXXXX - "
2411
" ------------- - X - X -X.....................X- ------------------- "
2412
" ----------------------------------- X...XXXXXXXXXXXXX...X - "
2413
" - X..X X..X - "
2414
" - X.X X.X - "
2415
" - XX XX - "
2416
} ;
2417
2418
static const ImVec2 FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[ ImGuiMouseCursor_COUNT] [ 3 ] =
2419
{
2420
2421
{ ImVec2 ( 0 , 3 ) , ImVec2 ( 12 , 19 ) , ImVec2 ( 0 , 0 ) } ,
2422
{ ImVec2 ( 13 , 0 ) , ImVec2 ( 7 , 16 ) , ImVec2 ( 1 , 8 ) } ,
2423
{ ImVec2 ( 31 , 0 ) , ImVec2 ( 23 , 23 ) , ImVec2 ( 11 , 11 ) } ,
2424
{ ImVec2 ( 21 , 0 ) , ImVec2 ( 9 , 23 ) , ImVec2 ( 4 , 11 ) } ,
2425
{ ImVec2 ( 55 , 18 ) , ImVec2 ( 23 , 9 ) , ImVec2 ( 11 , 4 ) } ,
2426
{ ImVec2 ( 73 , 0 ) , ImVec2 ( 17 , 17 ) , ImVec2 ( 8 , 8 ) } ,
2427
{ ImVec2 ( 55 , 0 ) , ImVec2 ( 17 , 17 ) , ImVec2 ( 8 , 8 ) } ,
2428
{ ImVec2 ( 91 , 0 ) , ImVec2 ( 17 , 22 ) , ImVec2 ( 5 , 0 ) } ,
2429
{ ImVec2 ( 109 , 0 ) , ImVec2 ( 13 , 15 ) , ImVec2 ( 6 , 7 ) } ,
2430
} ;
2431
2432
ImFontAtlas:: ImFontAtlas ( )
2433
{
2434
memset ( this , 0 , sizeof ( * this ) ) ;
2435
TexGlyphPadding = 1 ;
2436
PackIdMouseCursors = PackIdLines = - 1 ;
2437
}
2438
2439
ImFontAtlas:: ~ImFontAtlas ( )
2440
{
2441
IM_ASSERT ( ! Locked && " Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!" ) ;
2442
Clear ( ) ;
2443
}
2444
2445
void ImFontAtlas:: ClearInputData ( )
2446
{
2447
IM_ASSERT ( ! Locked && " Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!" ) ;
2448
for ( ImFontConfig& font_cfg : ConfigData)
2449
if ( font_cfg. FontData && font_cfg. FontDataOwnedByAtlas )
2450
{
2451
IM_FREE ( font_cfg. FontData ) ;
2452
font_cfg. FontData = NULL ;
2453
}
2454
2455
2456
for ( ImFont* font : Fonts)
2457
if ( font-> ConfigData >= ConfigData. Data && font-> ConfigData < ConfigData. Data + ConfigData. Size )
2458
{
2459
font-> ConfigData = NULL ;
2460
font-> ConfigDataCount = 0 ;
2461
}
2462
ConfigData. clear ( ) ;
2463
CustomRects. clear ( ) ;
2464
PackIdMouseCursors = PackIdLines = - 1 ;
2465
2466
}
2467
2468
void ImFontAtlas:: ClearTexData ( )
2469
{
2470
IM_ASSERT ( ! Locked && " Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!" ) ;
2471
if ( TexPixelsAlpha8)
2472
IM_FREE ( TexPixelsAlpha8 ) ;
2473
if ( TexPixelsRGBA32)
2474
IM_FREE ( TexPixelsRGBA32 ) ;
2475
TexPixelsAlpha8 = NULL ;
2476
TexPixelsRGBA32 = NULL ;
2477
TexPixelsUseColors = false ;
2478
2479
}
2480
2481
void ImFontAtlas:: ClearFonts ( )
2482
{
2483
IM_ASSERT ( ! Locked && " Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!" ) ;
2484
Fonts. clear_delete ( ) ;
2485
TexReady = false ;
2486
}
2487
2488
void ImFontAtlas:: Clear ( )
2489
{
2490
ClearInputData ( ) ;
2491
ClearTexData ( ) ;
2492
ClearFonts ( ) ;
2493
}
2494
2495
void ImFontAtlas:: GetTexDataAsAlpha8 ( unsigned char * * out_pixels , int * out_width , int * out_height , int * out_bytes_per_pixel )
2496
{
2497
2498
if ( TexPixelsAlpha8 == NULL )
2499
Build ( ) ;
2500
2501
* out_pixels = TexPixelsAlpha8;
2502
if ( out_width) * out_width = TexWidth;
2503
if ( out_height) * out_height = TexHeight;
2504
if ( out_bytes_per_pixel) * out_bytes_per_pixel = 1 ;
2505
}
2506
2507
void ImFontAtlas:: GetTexDataAsRGBA32 ( unsigned char * * out_pixels , int * out_width , int * out_height , int * out_bytes_per_pixel )
2508
{
2509
2510
2511
if ( ! TexPixelsRGBA32)
2512
{
2513
unsigned char * pixels = NULL ;
2514
GetTexDataAsAlpha8 ( & pixels, NULL , NULL ) ;
2515
if ( pixels)
2516
{
2517
TexPixelsRGBA32 = ( unsigned int * ) IM_ALLOC ( ( size_t ) TexWidth * ( size_t ) TexHeight * 4 ) ;
2518
const unsigned char * src = pixels;
2519
unsigned int * dst = TexPixelsRGBA32;
2520
for ( int n = TexWidth * TexHeight; n > 0 ; n- - )
2521
* dst+ + = IM_COL32 ( 255 , 255 , 255 , ( unsigned int ) ( * src+ + ) ) ;
2522
}
2523
}
2524
2525
* out_pixels = ( unsigned char * ) TexPixelsRGBA32;
2526
if ( out_width) * out_width = TexWidth;
2527
if ( out_height) * out_height = TexHeight;
2528
if ( out_bytes_per_pixel) * out_bytes_per_pixel = 4 ;
2529
}
2530
2531
ImFont* ImFontAtlas:: AddFont ( const ImFontConfig* font_cfg )
2532
{
2533
IM_ASSERT ( ! Locked && " Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!" ) ;
2534
IM_ASSERT ( font_cfg-> FontData != NULL && font_cfg-> FontDataSize > 0 ) ;
2535
IM_ASSERT ( font_cfg-> SizePixels > 0.0f && " Is ImFontConfig struct correctly initialized?" ) ;
2536
IM_ASSERT ( font_cfg-> OversampleH > 0 && font_cfg-> OversampleV > 0 && " Is ImFontConfig struct correctly initialized?" ) ;
2537
2538
2539
if ( ! font_cfg-> MergeMode )
2540
Fonts. push_back ( IM_NEW ( ImFont ) ) ;
2541
else
2542
IM_ASSERT ( Fonts. Size > 0 && " Cannot use MergeMode for the first font" ) ;
2543
2544
ConfigData. push_back ( * font_cfg) ;
2545
ImFontConfig& new_font_cfg = ConfigData. back ( ) ;
2546
if ( new_font_cfg. DstFont == NULL )
2547
new_font_cfg. DstFont = Fonts. back ( ) ;
2548
if ( ! new_font_cfg. FontDataOwnedByAtlas )
2549
{
2550
new_font_cfg. FontData = IM_ALLOC ( new_font_cfg. FontDataSize ) ;
2551
new_font_cfg. FontDataOwnedByAtlas = true ;
2552
memcpy ( new_font_cfg. FontData , font_cfg-> FontData , ( size_t ) new_font_cfg. FontDataSize ) ;
2553
}
2554
2555
if ( new_font_cfg. DstFont -> EllipsisChar == ( ImWchar) - 1 )
2556
new_font_cfg. DstFont -> EllipsisChar = font_cfg-> EllipsisChar ;
2557
2558
ImFontAtlasUpdateConfigDataPointers ( this ) ;
2559
2560
2561
TexReady = false ;
2562
ClearTexData ( ) ;
2563
return new_font_cfg. DstFont ;
2564
}
2565
2566
2567
static unsigned int stb_decompress_length ( const unsigned char * input ) ;
2568
static unsigned int stb_decompress ( unsigned char * output , const unsigned char * input , unsigned int length ) ;
2569
static const char * GetDefaultCompressedFontDataTTFBase85 ( ) ;
2570
static unsigned int Decode85Byte ( char c ) { return c >= ' \\ ' ? c- 36 : c- 35 ; }
2571
static void Decode85 ( const unsigned char * src , unsigned char * dst )
2572
{
2573
while ( * src)
2574
{
2575
unsigned int tmp = Decode85Byte ( src[ 0 ] ) + 85 * ( Decode85Byte ( src[ 1 ] ) + 85 * ( Decode85Byte ( src[ 2 ] ) + 85 * ( Decode85Byte ( src[ 3 ] ) + 85 * Decode85Byte ( src[ 4 ] ) ) ) ) ;
2576
dst[ 0 ] = ( ( tmp >> 0 ) & 0xFF ) ; dst[ 1 ] = ( ( tmp >> 8 ) & 0xFF ) ; dst[ 2 ] = ( ( tmp >> 16 ) & 0xFF ) ; dst[ 3 ] = ( ( tmp >> 24 ) & 0xFF ) ;
2577
src += 5 ;
2578
dst += 4 ;
2579
}
2580
}
2581
2582
2583
ImFont* ImFontAtlas:: AddFontDefault ( const ImFontConfig* font_cfg_template )
2584
{
2585
ImFontConfig font_cfg = font_cfg_template ? * font_cfg_template : ImFontConfig ( ) ;
2586
if ( ! font_cfg_template)
2587
{
2588
font_cfg. OversampleH = font_cfg. OversampleV = 1 ;
2589
font_cfg. PixelSnapH = true ;
2590
}
2591
if ( font_cfg. SizePixels <= 0.0f )
2592
font_cfg. SizePixels = 13.0f * 1.0f ;
2593
if ( font_cfg. Name [ 0 ] == ' \0 ' )
2594
ImFormatString ( font_cfg. Name , IM_ARRAYSIZE ( font_cfg. Name ) , " ProggyClean.ttf, %d px" , ( int ) font_cfg. SizePixels ) ;
2595
font_cfg. EllipsisChar = ( ImWchar) 0x0085 ;
2596
font_cfg. GlyphOffset . y = 1.0f * IM_TRUNC ( font_cfg. SizePixels / 13.0f ) ;
2597
2598
const char * ttf_compressed_base85 = GetDefaultCompressedFontDataTTFBase85 ( ) ;
2599
const ImWchar* glyph_ranges = font_cfg. GlyphRanges != NULL ? font_cfg. GlyphRanges : GetGlyphRangesDefault ( ) ;
2600
ImFont* font = AddFontFromMemoryCompressedBase85TTF ( ttf_compressed_base85, font_cfg. SizePixels , & font_cfg, glyph_ranges ) ;
2601
return font;
2602
}
2603
2604
ImFont* ImFontAtlas:: AddFontFromFileTTF ( const char * filename , float size_pixels , const ImFontConfig* font_cfg_template , const ImWchar* glyph_ranges )
2605
{
2606
IM_ASSERT ( ! Locked && " Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!" ) ;
2607
size_t data_size = 0 ;
2608
void * data = ImFileLoadToMemory ( filename, " rb" , & data_size, 0 ) ;
2609
if ( ! data)
2610
{
2611
IM_ASSERT_USER_ERROR ( 0 , " Could not load font file!" ) ;
2612
return NULL ;
2613
}
2614
ImFontConfig font_cfg = font_cfg_template ? * font_cfg_template : ImFontConfig ( ) ;
2615
if ( font_cfg. Name [ 0 ] == ' \0 ' )
2616
{
2617
2618
const char * p;
2619
for ( p = filename + strlen ( filename ) ; p > filename && p[ - 1 ] != ' /' && p[ - 1 ] != ' \\ ' ; p- - ) { }
2620
ImFormatString ( font_cfg. Name , IM_ARRAYSIZE ( font_cfg. Name ) , " %s , %.0f px" , p, size_pixels ) ;
2621
}
2622
return AddFontFromMemoryTTF ( data, ( int ) data_size, size_pixels, & font_cfg, glyph_ranges ) ;
2623
}
2624
2625
2626
ImFont* ImFontAtlas:: AddFontFromMemoryTTF ( void * font_data , int font_data_size , float size_pixels , const ImFontConfig* font_cfg_template , const ImWchar* glyph_ranges )
2627
{
2628
IM_ASSERT ( ! Locked && " Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!" ) ;
2629
ImFontConfig font_cfg = font_cfg_template ? * font_cfg_template : ImFontConfig ( ) ;
2630
IM_ASSERT ( font_cfg. FontData == NULL ) ;
2631
IM_ASSERT ( font_data_size > 100 && " Incorrect value for font_data_size!" ) ;
2632
font_cfg. FontData = font_data;
2633
font_cfg. FontDataSize = font_data_size;
2634
font_cfg. SizePixels = size_pixels > 0.0f ? size_pixels : font_cfg. SizePixels ;
2635
if ( glyph_ranges)
2636
font_cfg. GlyphRanges = glyph_ranges;
2637
return AddFont ( & font_cfg) ;
2638
}
2639
2640
ImFont* ImFontAtlas:: AddFontFromMemoryCompressedTTF ( const void * compressed_ttf_data , int compressed_ttf_size , float size_pixels , const ImFontConfig* font_cfg_template , const ImWchar* glyph_ranges )
2641
{
2642
const unsigned int buf_decompressed_size = stb_decompress_length ( ( const unsigned char * ) compressed_ttf_data) ;
2643
unsigned char * buf_decompressed_data = ( unsigned char * ) IM_ALLOC ( buf_decompressed_size ) ;
2644
stb_decompress ( buf_decompressed_data, ( const unsigned char * ) compressed_ttf_data, ( unsigned int ) compressed_ttf_size ) ;
2645
2646
ImFontConfig font_cfg = font_cfg_template ? * font_cfg_template : ImFontConfig ( ) ;
2647
IM_ASSERT ( font_cfg. FontData == NULL ) ;
2648
font_cfg. FontDataOwnedByAtlas = true ;
2649
return AddFontFromMemoryTTF ( buf_decompressed_data, ( int ) buf_decompressed_size, size_pixels, & font_cfg, glyph_ranges ) ;
2650
}
2651
2652
ImFont* ImFontAtlas:: AddFontFromMemoryCompressedBase85TTF ( const char * compressed_ttf_data_base85 , float size_pixels , const ImFontConfig* font_cfg , const ImWchar* glyph_ranges )
2653
{
2654
int compressed_ttf_size = ( ( ( int ) strlen ( compressed_ttf_data_base85 ) + 4 ) / 5 ) * 4 ;
2655
void * compressed_ttf = IM_ALLOC ( ( size_t ) compressed_ttf_size) ;
2656
Decode85 ( ( const unsigned char * ) compressed_ttf_data_base85, ( unsigned char * ) compressed_ttf) ;
2657
ImFont* font = AddFontFromMemoryCompressedTTF ( compressed_ttf, compressed_ttf_size, size_pixels, font_cfg, glyph_ranges ) ;
2658
IM_FREE ( compressed_ttf ) ;
2659
return font;
2660
}
2661
2662
int ImFontAtlas:: AddCustomRectRegular ( int width , int height )
2663
{
2664
IM_ASSERT ( width > 0 && width <= 0xFFFF ) ;
2665
IM_ASSERT ( height > 0 && height <= 0xFFFF ) ;
2666
ImFontAtlasCustomRect r;
2667
r. Width = ( unsigned short ) width;
2668
r. Height = ( unsigned short ) height;
2669
CustomRects. push_back ( r ) ;
2670
return CustomRects. Size - 1 ;
2671
}
2672
2673
int ImFontAtlas:: AddCustomRectFontGlyph ( ImFont* font , ImWchar id , int width , int height , float advance_x , const ImVec2& offset )
2674
{
2675
#ifdef IMGUI_USE_WCHAR32
2676
IM_ASSERT ( id <= IM_UNICODE_CODEPOINT_MAX) ;
2677
#endif
2678
IM_ASSERT ( font != NULL ) ;
2679
IM_ASSERT ( width > 0 && width <= 0xFFFF ) ;
2680
IM_ASSERT ( height > 0 && height <= 0xFFFF ) ;
2681
ImFontAtlasCustomRect r;
2682
r. Width = ( unsigned short ) width;
2683
r. Height = ( unsigned short ) height;
2684
r. GlyphID = id;
2685
r. GlyphColored = 0 ;
2686
r. GlyphAdvanceX = advance_x;
2687
r. GlyphOffset = offset;
2688
r. Font = font;
2689
CustomRects. push_back ( r ) ;
2690
return CustomRects. Size - 1 ;
2691
}
2692
2693
void ImFontAtlas:: CalcCustomRectUV ( const ImFontAtlasCustomRect* rect , ImVec2* out_uv_min , ImVec2* out_uv_max ) const
2694
{
2695
IM_ASSERT ( TexWidth > 0 && TexHeight > 0 ) ;
2696
IM_ASSERT ( rect-> IsPacked ( ) ) ;
2697
* out_uv_min = ImVec2 ( ( float ) rect-> X * TexUvScale. x , ( float ) rect-> Y * TexUvScale. y ) ;
2698
* out_uv_max = ImVec2 ( ( float ) ( rect-> X + rect-> Width ) * TexUvScale. x , ( float ) ( rect-> Y + rect-> Height ) * TexUvScale. y ) ;
2699
}
2700
2701
bool ImFontAtlas:: GetMouseCursorTexData ( ImGuiMouseCursor cursor_type , ImVec2* out_offset , ImVec2* out_size , ImVec2 out_uv_border [ 2 ] , ImVec2 out_uv_fill [ 2 ] )
2702
{
2703
if ( cursor_type <= ImGuiMouseCursor_None || cursor_type >= ImGuiMouseCursor_COUNT)
2704
return false ;
2705
if ( Flags & ImFontAtlasFlags_NoMouseCursors)
2706
return false ;
2707
2708
IM_ASSERT ( PackIdMouseCursors != - 1 ) ;
2709
ImFontAtlasCustomRect* r = GetCustomRectByIndex ( PackIdMouseCursors ) ;
2710
ImVec2 pos = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[ cursor_type] [ 0 ] + ImVec2 ( ( float ) r-> X , ( float ) r-> Y ) ;
2711
ImVec2 size = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[ cursor_type] [ 1 ] ;
2712
* out_size = size;
2713
* out_offset = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[ cursor_type] [ 2 ] ;
2714
out_uv_border[ 0 ] = ( pos) * TexUvScale;
2715
out_uv_border[ 1 ] = ( pos + size) * TexUvScale;
2716
pos. x += FONT_ATLAS_DEFAULT_TEX_DATA_W + 1 ;
2717
out_uv_fill[ 0 ] = ( pos) * TexUvScale;
2718
out_uv_fill[ 1 ] = ( pos + size) * TexUvScale;
2719
return true ;
2720
}
2721
2722
bool ImFontAtlas:: Build ( )
2723
{
2724
IM_ASSERT ( ! Locked && " Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!" ) ;
2725
2726
2727
if ( ConfigData. Size == 0 )
2728
AddFontDefault ( ) ;
2729
2730
2731
2732
2733
2734
2735
const ImFontBuilderIO* builder_io = FontBuilderIO;
2736
if ( builder_io == NULL )
2737
{
2738
#ifdef IMGUI_ENABLE_FREETYPE
2739
builder_io = ImGuiFreeType:: GetBuilderForFreeType ( ) ;
2740
#elif defined (IMGUI_ENABLE_STB_TRUETYPE)
2741
builder_io = ImFontAtlasGetBuilderForStbTruetype ( ) ;
2742
#else
2743
IM_ASSERT ( 0 ) ;
2744
#endif
2745
}
2746
2747
2748
return builder_io-> FontBuilder_Build ( this ) ;
2749
}
2750
2751
void ImFontAtlasBuildMultiplyCalcLookupTable ( unsigned char out_table [ 256 ] , float in_brighten_factor )
2752
{
2753
for ( unsigned int i = 0 ; i < 256 ; i+ + )
2754
{
2755
unsigned int value = ( unsigned int ) ( i * in_brighten_factor) ;
2756
out_table[ i] = value > 255 ? 255 : ( value & 0xFF ) ;
2757
}
2758
}
2759
2760
void ImFontAtlasBuildMultiplyRectAlpha8 ( const unsigned char table [ 256 ] , unsigned char * pixels , int x , int y , int w , int h , int stride )
2761
{
2762
IM_ASSERT_PARANOID ( w <= stride ) ;
2763
unsigned char * data = pixels + x + y * stride;
2764
for ( int j = h; j > 0 ; j- - , data += stride - w)
2765
for ( int i = w; i > 0 ; i- - , data+ + )
2766
* data = table[ * data] ;
2767
}
2768
2769
#ifdef IMGUI_ENABLE_STB_TRUETYPE
2770
2771
2772
struct ImFontBuildSrcData
2773
{
2774
stbtt_fontinfo FontInfo;
2775
stbtt_pack_range PackRange;
2776
stbrp_rect* Rects;
2777
stbtt_packedchar* PackedChars;
2778
const ImWchar* SrcRanges;
2779
int DstIndex;
2780
int GlyphsHighest;
2781
int GlyphsCount;
2782
ImBitVector GlyphsSet;
2783
ImVector< int > GlyphsList;
2784
} ;
2785
2786
2787
struct ImFontBuildDstData
2788
{
2789
int SrcCount;
2790
int GlyphsHighest;
2791
int GlyphsCount;
2792
ImBitVector GlyphsSet;
2793
} ;
2794
2795
static void UnpackBitVectorToFlatIndexList ( const ImBitVector* in , ImVector< int > * out )
2796
{
2797
IM_ASSERT ( sizeof ( in-> Storage . Data [ 0 ] ) == sizeof ( int ) ) ;
2798
const ImU32* it_begin = in-> Storage . begin ( ) ;
2799
const ImU32* it_end = in-> Storage . end ( ) ;
2800
for ( const ImU32* it = it_begin; it < it_end; it+ + )
2801
if ( ImU32 entries_32 = * it)
2802
for ( ImU32 bit_n = 0 ; bit_n < 32 ; bit_n+ + )
2803
if ( entries_32 & ( ( ImU32) 1 << bit_n) )
2804
out-> push_back ( ( int ) ( ( ( it - it_begin) << 5 ) + bit_n) ) ;
2805
}
2806
2807
static bool ImFontAtlasBuildWithStbTruetype ( ImFontAtlas* atlas )
2808
{
2809
IM_ASSERT ( atlas-> ConfigData . Size > 0 ) ;
2810
2811
ImFontAtlasBuildInit ( atlas ) ;
2812
2813
2814
atlas-> TexID = ( ImTextureID) NULL ;
2815
atlas-> TexWidth = atlas-> TexHeight = 0 ;
2816
atlas-> TexUvScale = ImVec2 ( 0.0f , 0.0f ) ;
2817
atlas-> TexUvWhitePixel = ImVec2 ( 0.0f , 0.0f ) ;
2818
atlas-> ClearTexData ( ) ;
2819
2820
2821
ImVector< ImFontBuildSrcData> src_tmp_array;
2822
ImVector< ImFontBuildDstData> dst_tmp_array;
2823
src_tmp_array. resize ( atlas-> ConfigData . Size ) ;
2824
dst_tmp_array. resize ( atlas-> Fonts . Size ) ;
2825
memset ( src_tmp_array. Data , 0 , ( size_t ) src_tmp_array. size_in_bytes ( ) ) ;
2826
memset ( dst_tmp_array. Data , 0 , ( size_t ) dst_tmp_array. size_in_bytes ( ) ) ;
2827
2828
2829
for ( int src_i = 0 ; src_i < atlas-> ConfigData . Size ; src_i+ + )
2830
{
2831
ImFontBuildSrcData& src_tmp = src_tmp_array[ src_i] ;
2832
ImFontConfig& cfg = atlas-> ConfigData [ src_i] ;
2833
IM_ASSERT ( cfg. DstFont && ( ! cfg. DstFont -> IsLoaded ( ) || cfg. DstFont -> ContainerAtlas == atlas) ) ;
2834
2835
2836
src_tmp. DstIndex = - 1 ;
2837
for ( int output_i = 0 ; output_i < atlas-> Fonts . Size && src_tmp. DstIndex == - 1 ; output_i+ + )
2838
if ( cfg. DstFont == atlas-> Fonts [ output_i] )
2839
src_tmp. DstIndex = output_i;
2840
if ( src_tmp. DstIndex == - 1 )
2841
{
2842
IM_ASSERT ( src_tmp. DstIndex != - 1 ) ;
2843
return false ;
2844
}
2845
2846
const int font_offset = stbtt_GetFontOffsetForIndex ( ( unsigned char * ) cfg. FontData , cfg. FontNo ) ;
2847
IM_ASSERT ( font_offset >= 0 && " FontData is incorrect, or FontNo cannot be found." ) ;
2848
if ( ! stbtt_InitFont ( & src_tmp. FontInfo , ( unsigned char * ) cfg. FontData , font_offset) )
2849
{
2850
IM_ASSERT ( 0 && " stbtt_InitFont(): failed to parse FontData. It is correct and complete? Check FontDataSize." ) ;
2851
return false ;
2852
}
2853
2854
2855
ImFontBuildDstData& dst_tmp = dst_tmp_array[ src_tmp. DstIndex ] ;
2856
src_tmp. SrcRanges = cfg. GlyphRanges ? cfg. GlyphRanges : atlas-> GetGlyphRangesDefault ( ) ;
2857
for ( const ImWchar* src_range = src_tmp. SrcRanges ; src_range[ 0 ] && src_range[ 1 ] ; src_range += 2 )
2858
{
2859
2860
2861
2862
IM_ASSERT ( src_range[ 0 ] <= src_range[ 1 ] && " Invalid range: is your glyph range array persistent? it is zero-terminated?" ) ;
2863
src_tmp. GlyphsHighest = ImMax ( src_tmp. GlyphsHighest , ( int ) src_range[ 1 ] ) ;
2864
}
2865
dst_tmp. SrcCount + + ;
2866
dst_tmp. GlyphsHighest = ImMax ( dst_tmp. GlyphsHighest , src_tmp. GlyphsHighest ) ;
2867
}
2868
2869
2870
int total_glyphs_count = 0 ;
2871
for ( int src_i = 0 ; src_i < src_tmp_array. Size ; src_i+ + )
2872
{
2873
ImFontBuildSrcData& src_tmp = src_tmp_array[ src_i] ;
2874
ImFontBuildDstData& dst_tmp = dst_tmp_array[ src_tmp. DstIndex ] ;
2875
src_tmp. GlyphsSet . Create ( src_tmp. GlyphsHighest + 1 ) ;
2876
if ( dst_tmp. GlyphsSet . Storage . empty ( ) )
2877
dst_tmp. GlyphsSet . Create ( dst_tmp. GlyphsHighest + 1 ) ;
2878
2879
for ( const ImWchar* src_range = src_tmp. SrcRanges ; src_range[ 0 ] && src_range[ 1 ] ; src_range += 2 )
2880
for ( unsigned int codepoint = src_range[ 0 ] ; codepoint <= src_range[ 1 ] ; codepoint+ + )
2881
{
2882
if ( dst_tmp. GlyphsSet . TestBit ( codepoint ) )
2883
continue ;
2884
if ( ! stbtt_FindGlyphIndex ( & src_tmp. FontInfo , codepoint) )
2885
continue ;
2886
2887
2888
src_tmp. GlyphsCount + + ;
2889
dst_tmp. GlyphsCount + + ;
2890
src_tmp. GlyphsSet . SetBit ( codepoint ) ;
2891
dst_tmp. GlyphsSet . SetBit ( codepoint ) ;
2892
total_glyphs_count+ + ;
2893
}
2894
}
2895
2896
2897
for ( int src_i = 0 ; src_i < src_tmp_array. Size ; src_i+ + )
2898
{
2899
ImFontBuildSrcData& src_tmp = src_tmp_array[ src_i] ;
2900
src_tmp. GlyphsList . reserve ( src_tmp. GlyphsCount ) ;
2901
UnpackBitVectorToFlatIndexList ( & src_tmp. GlyphsSet , & src_tmp. GlyphsList ) ;
2902
src_tmp. GlyphsSet . Clear ( ) ;
2903
IM_ASSERT ( src_tmp. GlyphsList . Size == src_tmp. GlyphsCount ) ;
2904
}
2905
for ( int dst_i = 0 ; dst_i < dst_tmp_array. Size ; dst_i+ + )
2906
dst_tmp_array[ dst_i] . GlyphsSet . Clear ( ) ;
2907
dst_tmp_array. clear ( ) ;
2908
2909
2910
2911
ImVector< stbrp_rect> buf_rects;
2912
ImVector< stbtt_packedchar> buf_packedchars;
2913
buf_rects. resize ( total_glyphs_count ) ;
2914
buf_packedchars. resize ( total_glyphs_count ) ;
2915
memset ( buf_rects. Data , 0 , ( size_t ) buf_rects. size_in_bytes ( ) ) ;
2916
memset ( buf_packedchars. Data , 0 , ( size_t ) buf_packedchars. size_in_bytes ( ) ) ;
2917
2918
2919
int total_surface = 0 ;
2920
int buf_rects_out_n = 0 ;
2921
int buf_packedchars_out_n = 0 ;
2922
for ( int src_i = 0 ; src_i < src_tmp_array. Size ; src_i+ + )
2923
{
2924
ImFontBuildSrcData& src_tmp = src_tmp_array[ src_i] ;
2925
if ( src_tmp. GlyphsCount == 0 )
2926
continue ;
2927
2928
src_tmp. Rects = & buf_rects[ buf_rects_out_n] ;
2929
src_tmp. PackedChars = & buf_packedchars[ buf_packedchars_out_n] ;
2930
buf_rects_out_n += src_tmp. GlyphsCount ;
2931
buf_packedchars_out_n += src_tmp. GlyphsCount ;
2932
2933
2934
ImFontConfig& cfg = atlas-> ConfigData [ src_i] ;
2935
src_tmp. PackRange . font_size = cfg. SizePixels * cfg. RasterizerDensity ;
2936
src_tmp. PackRange . first_unicode_codepoint_in_range = 0 ;
2937
src_tmp. PackRange . array_of_unicode_codepoints = src_tmp. GlyphsList . Data ;
2938
src_tmp. PackRange . num_chars = src_tmp. GlyphsList . Size ;
2939
src_tmp. PackRange . chardata_for_range = src_tmp. PackedChars ;
2940
src_tmp. PackRange . h_oversample = ( unsigned char ) cfg. OversampleH ;
2941
src_tmp. PackRange . v_oversample = ( unsigned char ) cfg. OversampleV ;
2942
2943
2944
const float scale = ( cfg. SizePixels > 0.0f ) ? stbtt_ScaleForPixelHeight ( & src_tmp. FontInfo , cfg. SizePixels * cfg. RasterizerDensity ) : stbtt_ScaleForMappingEmToPixels ( & src_tmp. FontInfo , - cfg. SizePixels * cfg. RasterizerDensity ) ;
2945
const int padding = atlas-> TexGlyphPadding ;
2946
for ( int glyph_i = 0 ; glyph_i < src_tmp. GlyphsList . Size ; glyph_i+ + )
2947
{
2948
int x0, y0, x1, y1;
2949
const int glyph_index_in_font = stbtt_FindGlyphIndex ( & src_tmp. FontInfo , src_tmp. GlyphsList [ glyph_i] ) ;
2950
IM_ASSERT ( glyph_index_in_font != 0 ) ;
2951
stbtt_GetGlyphBitmapBoxSubpixel ( & src_tmp. FontInfo , glyph_index_in_font, scale * cfg. OversampleH , scale * cfg. OversampleV , 0 , 0 , & x0, & y0, & x1, & y1) ;
2952
src_tmp. Rects [ glyph_i] . w = ( stbrp_coord) ( x1 - x0 + padding + cfg. OversampleH - 1 ) ;
2953
src_tmp. Rects [ glyph_i] . h = ( stbrp_coord) ( y1 - y0 + padding + cfg. OversampleV - 1 ) ;
2954
total_surface += src_tmp. Rects [ glyph_i] . w * src_tmp. Rects [ glyph_i] . h ;
2955
}
2956
}
2957
2958
2959
2960
2961
const int surface_sqrt = ( int ) ImSqrt ( ( float ) total_surface) + 1 ;
2962
atlas-> TexHeight = 0 ;
2963
if ( atlas-> TexDesiredWidth > 0 )
2964
atlas-> TexWidth = atlas-> TexDesiredWidth ;
2965
else
2966
atlas-> TexWidth = ( surface_sqrt >= 4096 * 0.7f ) ? 4096 : ( surface_sqrt >= 2048 * 0.7f ) ? 2048 : ( surface_sqrt >= 1024 * 0.7f ) ? 1024 : 512 ;
2967
2968
2969
2970
const int TEX_HEIGHT_MAX = 1024 * 32 ;
2971
stbtt_pack_context spc = { } ;
2972
stbtt_PackBegin ( & spc, NULL , atlas-> TexWidth , TEX_HEIGHT_MAX, 0 , atlas-> TexGlyphPadding , NULL ) ;
2973
ImFontAtlasBuildPackCustomRects ( atlas, spc. pack_info ) ;
2974
2975
2976
for ( int src_i = 0 ; src_i < src_tmp_array. Size ; src_i+ + )
2977
{
2978
ImFontBuildSrcData& src_tmp = src_tmp_array[ src_i] ;
2979
if ( src_tmp. GlyphsCount == 0 )
2980
continue ;
2981
2982
stbrp_pack_rects ( ( stbrp_context* ) spc. pack_info , src_tmp. Rects , src_tmp. GlyphsCount ) ;
2983
2984
2985
2986
for ( int glyph_i = 0 ; glyph_i < src_tmp. GlyphsCount ; glyph_i+ + )
2987
if ( src_tmp. Rects [ glyph_i] . was_packed )
2988
atlas-> TexHeight = ImMax ( atlas-> TexHeight , src_tmp. Rects [ glyph_i] . y + src_tmp. Rects [ glyph_i] . h ) ;
2989
}
2990
2991
2992
atlas-> TexHeight = ( atlas-> Flags & ImFontAtlasFlags_NoPowerOfTwoHeight) ? ( atlas-> TexHeight + 1 ) : ImUpperPowerOfTwo ( atlas-> TexHeight ) ;
2993
atlas-> TexUvScale = ImVec2 ( 1.0f / atlas-> TexWidth , 1.0f / atlas-> TexHeight ) ;
2994
atlas-> TexPixelsAlpha8 = ( unsigned char * ) IM_ALLOC ( atlas-> TexWidth * atlas-> TexHeight ) ;
2995
memset ( atlas-> TexPixelsAlpha8 , 0 , atlas-> TexWidth * atlas-> TexHeight ) ;
2996
spc. pixels = atlas-> TexPixelsAlpha8 ;
2997
spc. height = atlas-> TexHeight ;
2998
2999
3000
for ( int src_i = 0 ; src_i < src_tmp_array. Size ; src_i+ + )
3001
{
3002
ImFontConfig& cfg = atlas-> ConfigData [ src_i] ;
3003
ImFontBuildSrcData& src_tmp = src_tmp_array[ src_i] ;
3004
if ( src_tmp. GlyphsCount == 0 )
3005
continue ;
3006
3007
stbtt_PackFontRangesRenderIntoRects ( & spc, & src_tmp. FontInfo , & src_tmp. PackRange , 1 , src_tmp. Rects ) ;
3008
3009
3010
if ( cfg. RasterizerMultiply != 1.0f )
3011
{
3012
unsigned char multiply_table[ 256 ] ;
3013
ImFontAtlasBuildMultiplyCalcLookupTable ( multiply_table, cfg. RasterizerMultiply ) ;
3014
stbrp_rect* r = & src_tmp. Rects [ 0 ] ;
3015
for ( int glyph_i = 0 ; glyph_i < src_tmp. GlyphsCount ; glyph_i+ + , r+ + )
3016
if ( r-> was_packed )
3017
ImFontAtlasBuildMultiplyRectAlpha8 ( multiply_table, atlas-> TexPixelsAlpha8 , r-> x , r-> y , r-> w , r-> h , atlas-> TexWidth * 1 ) ;
3018
}
3019
src_tmp. Rects = NULL ;
3020
}
3021
3022
3023
stbtt_PackEnd ( & spc) ;
3024
buf_rects. clear ( ) ;
3025
3026
3027
for ( int src_i = 0 ; src_i < src_tmp_array. Size ; src_i+ + )
3028
{
3029
3030
3031
3032
ImFontBuildSrcData& src_tmp = src_tmp_array[ src_i] ;
3033
ImFontConfig& cfg = atlas-> ConfigData [ src_i] ;
3034
ImFont* dst_font = cfg. DstFont ;
3035
3036
const float font_scale = stbtt_ScaleForPixelHeight ( & src_tmp. FontInfo , cfg. SizePixels ) ;
3037
int unscaled_ascent, unscaled_descent, unscaled_line_gap;
3038
stbtt_GetFontVMetrics ( & src_tmp. FontInfo , & unscaled_ascent, & unscaled_descent, & unscaled_line_gap) ;
3039
3040
const float ascent = ImCeil ( unscaled_ascent * font_scale ) ;
3041
const float descent = ImFloor ( unscaled_descent * font_scale ) ;
3042
ImFontAtlasBuildSetupFont ( atlas, dst_font, & cfg, ascent, descent ) ;
3043
const float font_off_x = cfg. GlyphOffset . x ;
3044
const float font_off_y = cfg. GlyphOffset . y + IM_ROUND ( dst_font-> Ascent ) ;
3045
3046
const float inv_rasterization_scale = 1.0f / cfg. RasterizerDensity ;
3047
3048
for ( int glyph_i = 0 ; glyph_i < src_tmp. GlyphsCount ; glyph_i+ + )
3049
{
3050
3051
const int codepoint = src_tmp. GlyphsList [ glyph_i] ;
3052
const stbtt_packedchar& pc = src_tmp. PackedChars [ glyph_i] ;
3053
stbtt_aligned_quad q;
3054
float unused_x = 0.0f , unused_y = 0.0f ;
3055
stbtt_GetPackedQuad ( src_tmp. PackedChars , atlas-> TexWidth , atlas-> TexHeight , glyph_i, & unused_x, & unused_y, & q, 0 ) ;
3056
float x0 = q. x0 * inv_rasterization_scale + font_off_x;
3057
float y0 = q. y0 * inv_rasterization_scale + font_off_y;
3058
float x1 = q. x1 * inv_rasterization_scale + font_off_x;
3059
float y1 = q. y1 * inv_rasterization_scale + font_off_y;
3060
dst_font-> AddGlyph ( & cfg, ( ImWchar) codepoint, x0, y0, x1, y1, q. s0 , q. t0 , q. s1 , q. t1 , pc. xadvance * inv_rasterization_scale) ;
3061
}
3062
}
3063
3064
3065
src_tmp_array. clear_destruct ( ) ;
3066
3067
ImFontAtlasBuildFinish ( atlas ) ;
3068
return true ;
3069
}
3070
3071
const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype ( )
3072
{
3073
static ImFontBuilderIO io;
3074
io. FontBuilder_Build = ImFontAtlasBuildWithStbTruetype;
3075
return & io;
3076
}
3077
3078
#endif
3079
3080
void ImFontAtlasUpdateConfigDataPointers ( ImFontAtlas* atlas )
3081
{
3082
for ( ImFontConfig& font_cfg : atlas-> ConfigData )
3083
{
3084
ImFont* font = font_cfg. DstFont ;
3085
if ( ! font_cfg. MergeMode )
3086
{
3087
font-> ConfigData = & font_cfg;
3088
font-> ConfigDataCount = 0 ;
3089
}
3090
font-> ConfigDataCount + + ;
3091
}
3092
}
3093
3094
void ImFontAtlasBuildSetupFont ( ImFontAtlas* atlas , ImFont* font , ImFontConfig* font_config , float ascent , float descent )
3095
{
3096
if ( ! font_config-> MergeMode )
3097
{
3098
font-> ClearOutputData ( ) ;
3099
font-> FontSize = font_config-> SizePixels ;
3100
IM_ASSERT ( font-> ConfigData == font_config ) ;
3101
font-> ContainerAtlas = atlas;
3102
font-> Ascent = ascent;
3103
font-> Descent = descent;
3104
}
3105
}
3106
3107
void ImFontAtlasBuildPackCustomRects ( ImFontAtlas* atlas , void * stbrp_context_opaque )
3108
{
3109
stbrp_context* pack_context = ( stbrp_context* ) stbrp_context_opaque;
3110
IM_ASSERT ( pack_context != NULL ) ;
3111
3112
ImVector< ImFontAtlasCustomRect> & user_rects = atlas-> CustomRects ;
3113
IM_ASSERT ( user_rects. Size >= 1 ) ;
3114
#ifdef __GNUC__
3115
if ( user_rects. Size < 1 ) { __builtin_unreachable ( ) ; }
3116
#endif
3117
3118
ImVector< stbrp_rect> pack_rects;
3119
pack_rects. resize ( user_rects. Size ) ;
3120
memset ( pack_rects. Data , 0 , ( size_t ) pack_rects. size_in_bytes ( ) ) ;
3121
for ( int i = 0 ; i < user_rects. Size ; i+ + )
3122
{
3123
pack_rects[ i] . w = user_rects[ i] . Width ;
3124
pack_rects[ i] . h = user_rects[ i] . Height ;
3125
}
3126
stbrp_pack_rects ( pack_context, & pack_rects[ 0 ] , pack_rects. Size ) ;
3127
for ( int i = 0 ; i < pack_rects. Size ; i+ + )
3128
if ( pack_rects[ i] . was_packed )
3129
{
3130
user_rects[ i] . X = ( unsigned short ) pack_rects[ i] . x ;
3131
user_rects[ i] . Y = ( unsigned short ) pack_rects[ i] . y ;
3132
IM_ASSERT ( pack_rects[ i] . w == user_rects[ i] . Width && pack_rects[ i] . h == user_rects[ i] . Height ) ;
3133
atlas-> TexHeight = ImMax ( atlas-> TexHeight , pack_rects[ i] . y + pack_rects[ i] . h ) ;
3134
}
3135
}
3136
3137
void ImFontAtlasBuildRender8bppRectFromString ( ImFontAtlas* atlas , int x , int y , int w , int h , const char * in_str , char in_marker_char , unsigned char in_marker_pixel_value )
3138
{
3139
IM_ASSERT ( x >= 0 && x + w <= atlas-> TexWidth ) ;
3140
IM_ASSERT ( y >= 0 && y + h <= atlas-> TexHeight ) ;
3141
unsigned char * out_pixel = atlas-> TexPixelsAlpha8 + x + ( y * atlas-> TexWidth ) ;
3142
for ( int off_y = 0 ; off_y < h; off_y+ + , out_pixel += atlas-> TexWidth , in_str += w)
3143
for ( int off_x = 0 ; off_x < w; off_x+ + )
3144
out_pixel[ off_x] = ( in_str[ off_x] == in_marker_char) ? in_marker_pixel_value : 0x00 ;
3145
}
3146
3147
void ImFontAtlasBuildRender32bppRectFromString ( ImFontAtlas* atlas , int x , int y , int w , int h , const char * in_str , char in_marker_char , unsigned int in_marker_pixel_value )
3148
{
3149
IM_ASSERT ( x >= 0 && x + w <= atlas-> TexWidth ) ;
3150
IM_ASSERT ( y >= 0 && y + h <= atlas-> TexHeight ) ;
3151
unsigned int * out_pixel = atlas-> TexPixelsRGBA32 + x + ( y * atlas-> TexWidth ) ;
3152
for ( int off_y = 0 ; off_y < h; off_y+ + , out_pixel += atlas-> TexWidth , in_str += w)
3153
for ( int off_x = 0 ; off_x < w; off_x+ + )
3154
out_pixel[ off_x] = ( in_str[ off_x] == in_marker_char) ? in_marker_pixel_value : IM_COL32_BLACK_TRANS;
3155
}
3156
3157
static void ImFontAtlasBuildRenderDefaultTexData ( ImFontAtlas* atlas )
3158
{
3159
ImFontAtlasCustomRect* r = atlas-> GetCustomRectByIndex ( atlas-> PackIdMouseCursors ) ;
3160
IM_ASSERT ( r-> IsPacked ( ) ) ;
3161
3162
const int w = atlas-> TexWidth ;
3163
if ( ! ( atlas-> Flags & ImFontAtlasFlags_NoMouseCursors) )
3164
{
3165
3166
IM_ASSERT ( r-> Width == FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1 && r-> Height == FONT_ATLAS_DEFAULT_TEX_DATA_H ) ;
3167
const int x_for_white = r-> X ;
3168
const int x_for_black = r-> X + FONT_ATLAS_DEFAULT_TEX_DATA_W + 1 ;
3169
if ( atlas-> TexPixelsAlpha8 != NULL )
3170
{
3171
ImFontAtlasBuildRender8bppRectFromString ( atlas, x_for_white, r-> Y , FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, ' .' , 0xFF ) ;
3172
ImFontAtlasBuildRender8bppRectFromString ( atlas, x_for_black, r-> Y , FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, ' X' , 0xFF ) ;
3173
}
3174
else
3175
{
3176
ImFontAtlasBuildRender32bppRectFromString ( atlas, x_for_white, r-> Y , FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, ' .' , IM_COL32_WHITE ) ;
3177
ImFontAtlasBuildRender32bppRectFromString ( atlas, x_for_black, r-> Y , FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, ' X' , IM_COL32_WHITE ) ;
3178
}
3179
}
3180
else
3181
{
3182
3183
IM_ASSERT ( r-> Width == 2 && r-> Height == 2 ) ;
3184
const int offset = ( int ) r-> X + ( int ) r-> Y * w;
3185
if ( atlas-> TexPixelsAlpha8 != NULL )
3186
{
3187
atlas-> TexPixelsAlpha8 [ offset] = atlas-> TexPixelsAlpha8 [ offset + 1 ] = atlas-> TexPixelsAlpha8 [ offset + w] = atlas-> TexPixelsAlpha8 [ offset + w + 1 ] = 0xFF ;
3188
}
3189
else
3190
{
3191
atlas-> TexPixelsRGBA32 [ offset] = atlas-> TexPixelsRGBA32 [ offset + 1 ] = atlas-> TexPixelsRGBA32 [ offset + w] = atlas-> TexPixelsRGBA32 [ offset + w + 1 ] = IM_COL32_WHITE;
3192
}
3193
}
3194
atlas-> TexUvWhitePixel = ImVec2 ( ( r-> X + 0.5f ) * atlas-> TexUvScale . x , ( r-> Y + 0.5f ) * atlas-> TexUvScale . y ) ;
3195
}
3196
3197
static void ImFontAtlasBuildRenderLinesTexData ( ImFontAtlas* atlas )
3198
{
3199
if ( atlas-> Flags & ImFontAtlasFlags_NoBakedLines)
3200
return ;
3201
3202
3203
ImFontAtlasCustomRect* r = atlas-> GetCustomRectByIndex ( atlas-> PackIdLines ) ;
3204
IM_ASSERT ( r-> IsPacked ( ) ) ;
3205
for ( unsigned int n = 0 ; n < IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1 ; n+ + )
3206
{
3207
3208
unsigned int y = n;
3209
unsigned int line_width = n;
3210
unsigned int pad_left = ( r-> Width - line_width) / 2 ;
3211
unsigned int pad_right = r-> Width - ( pad_left + line_width) ;
3212
3213
3214
IM_ASSERT ( pad_left + line_width + pad_right == r-> Width && y < r-> Height ) ;
3215
if ( atlas-> TexPixelsAlpha8 != NULL )
3216
{
3217
unsigned char * write_ptr = & atlas-> TexPixelsAlpha8 [ r-> X + ( ( r-> Y + y) * atlas-> TexWidth ) ] ;
3218
for ( unsigned int i = 0 ; i < pad_left; i+ + )
3219
* ( write_ptr + i) = 0x00 ;
3220
3221
for ( unsigned int i = 0 ; i < line_width; i+ + )
3222
* ( write_ptr + pad_left + i) = 0xFF ;
3223
3224
for ( unsigned int i = 0 ; i < pad_right; i+ + )
3225
* ( write_ptr + pad_left + line_width + i) = 0x00 ;
3226
}
3227
else
3228
{
3229
unsigned int * write_ptr = & atlas-> TexPixelsRGBA32 [ r-> X + ( ( r-> Y + y) * atlas-> TexWidth ) ] ;
3230
for ( unsigned int i = 0 ; i < pad_left; i+ + )
3231
* ( write_ptr + i) = IM_COL32 ( 255 , 255 , 255 , 0 ) ;
3232
3233
for ( unsigned int i = 0 ; i < line_width; i+ + )
3234
* ( write_ptr + pad_left + i) = IM_COL32_WHITE;
3235
3236
for ( unsigned int i = 0 ; i < pad_right; i+ + )
3237
* ( write_ptr + pad_left + line_width + i) = IM_COL32 ( 255 , 255 , 255 , 0 ) ;
3238
}
3239
3240
3241
ImVec2 uv0 = ImVec2 ( ( float ) ( r-> X + pad_left - 1 ) , ( float ) ( r-> Y + y) ) * atlas-> TexUvScale ;
3242
ImVec2 uv1 = ImVec2 ( ( float ) ( r-> X + pad_left + line_width + 1 ) , ( float ) ( r-> Y + y + 1 ) ) * atlas-> TexUvScale ;
3243
float half_v = ( uv0. y + uv1. y ) * 0.5f ;
3244
atlas-> TexUvLines [ n] = ImVec4 ( uv0. x , half_v, uv1. x , half_v ) ;
3245
}
3246
}
3247
3248
3249
void ImFontAtlasBuildInit ( ImFontAtlas* atlas )
3250
{
3251
3252
3253
3254
3255
for ( ImFontConfig& cfg : atlas-> ConfigData )
3256
cfg. SizePixels = ImTrunc ( cfg. SizePixels ) ;
3257
3258
3259
if ( atlas-> PackIdMouseCursors < 0 )
3260
{
3261
if ( ! ( atlas-> Flags & ImFontAtlasFlags_NoMouseCursors) )
3262
atlas-> PackIdMouseCursors = atlas-> AddCustomRectRegular ( FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1 , FONT_ATLAS_DEFAULT_TEX_DATA_H ) ;
3263
else
3264
atlas-> PackIdMouseCursors = atlas-> AddCustomRectRegular ( 2 , 2 ) ;
3265
}
3266
3267
3268
3269
if ( atlas-> PackIdLines < 0 )
3270
{
3271
if ( ! ( atlas-> Flags & ImFontAtlasFlags_NoBakedLines) )
3272
atlas-> PackIdLines = atlas-> AddCustomRectRegular ( IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 2 , IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1 ) ;
3273
}
3274
}
3275
3276
3277
void ImFontAtlasBuildFinish ( ImFontAtlas* atlas )
3278
{
3279
3280
IM_ASSERT ( atlas-> TexPixelsAlpha8 != NULL || atlas-> TexPixelsRGBA32 != NULL ) ;
3281
ImFontAtlasBuildRenderDefaultTexData ( atlas ) ;
3282
ImFontAtlasBuildRenderLinesTexData ( atlas ) ;
3283
3284
3285
for ( int i = 0 ; i < atlas-> CustomRects . Size ; i+ + )
3286
{
3287
const ImFontAtlasCustomRect* r = & atlas-> CustomRects [ i] ;
3288
if ( r-> Font == NULL || r-> GlyphID == 0 )
3289
continue ;
3290
3291
3292
IM_ASSERT ( r-> Font -> ContainerAtlas == atlas ) ;
3293
ImVec2 uv0, uv1;
3294
atlas-> CalcCustomRectUV ( r, & uv0, & uv1 ) ;
3295
r-> Font -> AddGlyph ( NULL , ( ImWchar) r-> GlyphID , r-> GlyphOffset . x , r-> GlyphOffset . y , r-> GlyphOffset . x + r-> Width , r-> GlyphOffset . y + r-> Height , uv0. x , uv0. y , uv1. x , uv1. y , r-> GlyphAdvanceX ) ;
3296
if ( r-> GlyphColored )
3297
r-> Font -> Glyphs . back ( ) . Colored = 1 ;
3298
}
3299
3300
3301
for ( ImFont* font : atlas-> Fonts )
3302
if ( font-> DirtyLookupTables )
3303
font-> BuildLookupTable ( ) ;
3304
3305
atlas-> TexReady = true ;
3306
}
3307
3308
3309
const ImWchar* ImFontAtlas:: GetGlyphRangesDefault ( )
3310
{
3311
static const ImWchar ranges[ ] =
3312
{
3313
0x0020 , 0x00FF ,
3314
0 ,
3315
} ;
3316
return & ranges[ 0 ] ;
3317
}
3318
3319
const ImWchar* ImFontAtlas:: GetGlyphRangesGreek ( )
3320
{
3321
static const ImWchar ranges[ ] =
3322
{
3323
0x0020 , 0x00FF ,
3324
0x0370 , 0x03FF ,
3325
0 ,
3326
} ;
3327
return & ranges[ 0 ] ;
3328
}
3329
3330
const ImWchar* ImFontAtlas:: GetGlyphRangesKorean ( )
3331
{
3332
static const ImWchar ranges[ ] =
3333
{
3334
0x0020 , 0x00FF ,
3335
0x3131 , 0x3163 ,
3336
0xAC00 , 0xD7A3 ,
3337
0xFFFD , 0xFFFD ,
3338
0 ,
3339
} ;
3340
return & ranges[ 0 ] ;
3341
}
3342
3343
const ImWchar* ImFontAtlas:: GetGlyphRangesChineseFull ( )
3344
{
3345
static const ImWchar ranges[ ] =
3346
{
3347
0x0020 , 0x00FF ,
3348
0x2000 , 0x206F ,
3349
0x3000 , 0x30FF ,
3350
0x31F0 , 0x31FF ,
3351
0xFF00 , 0xFFEF ,
3352
0xFFFD , 0xFFFD ,
3353
0x4e00 , 0x9FAF ,
3354
0 ,
3355
} ;
3356
return & ranges[ 0 ] ;
3357
}
3358
3359
static void UnpackAccumulativeOffsetsIntoRanges ( int base_codepoint , const short * accumulative_offsets , int accumulative_offsets_count , ImWchar* out_ranges )
3360
{
3361
for ( int n = 0 ; n < accumulative_offsets_count; n+ + , out_ranges += 2 )
3362
{
3363
out_ranges[ 0 ] = out_ranges[ 1 ] = ( ImWchar) ( base_codepoint + accumulative_offsets[ n] ) ;
3364
base_codepoint += accumulative_offsets[ n] ;
3365
}
3366
out_ranges[ 0 ] = 0 ;
3367
}
3368
3369
3370
3371
3372
3373
const ImWchar* ImFontAtlas:: GetGlyphRangesChineseSimplifiedCommon ( )
3374
{
3375
3376
3377
3378
3379
3380
static const short accumulative_offsets_from_0x4E00[ ] =
3381
{
3382
0 , 1 , 2 , 4 , 1 , 1 , 1 , 1 , 2 , 1 , 3 , 2 , 1 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 5 , 2 , 1 , 2 , 3 , 3 , 3 , 2 , 2 , 4 , 1 , 1 , 1 , 2 , 1 , 5 , 2 , 3 , 1 , 2 , 1 , 2 , 1 , 1 , 2 , 1 , 1 , 2 , 2 , 1 , 4 , 1 , 1 , 1 , 1 , 5 , 10 , 1 , 2 , 19 , 2 , 1 , 2 , 1 , 2 , 1 , 2 , 1 , 2 ,
3383
1 , 5 , 1 , 6 , 3 , 2 , 1 , 2 , 2 , 1 , 1 , 1 , 4 , 8 , 5 , 1 , 1 , 4 , 1 , 1 , 3 , 1 , 2 , 1 , 5 , 1 , 2 , 1 , 1 , 1 , 10 , 1 , 1 , 5 , 2 , 4 , 6 , 1 , 4 , 2 , 2 , 2 , 12 , 2 , 1 , 1 , 6 , 1 , 1 , 1 , 4 , 1 , 1 , 4 , 6 , 5 , 1 , 4 , 2 , 2 , 4 , 10 , 7 , 1 , 1 , 4 , 2 , 4 ,
3384
2 , 1 , 4 , 3 , 6 , 10 , 12 , 5 , 7 , 2 , 14 , 2 , 9 , 1 , 1 , 6 , 7 , 10 , 4 , 7 , 13 , 1 , 5 , 4 , 8 , 4 , 1 , 1 , 2 , 28 , 5 , 6 , 1 , 1 , 5 , 2 , 5 , 20 , 2 , 2 , 9 , 8 , 11 , 2 , 9 , 17 , 1 , 8 , 6 , 8 , 27 , 4 , 6 , 9 , 20 , 11 , 27 , 6 , 68 , 2 , 2 , 1 , 1 ,
3385
1 , 2 , 1 , 2 , 2 , 7 , 6 , 11 , 3 , 3 , 1 , 1 , 3 , 1 , 2 , 1 , 1 , 1 , 1 , 1 , 3 , 1 , 1 , 8 , 3 , 4 , 1 , 5 , 7 , 2 , 1 , 4 , 4 , 8 , 4 , 2 , 1 , 2 , 1 , 1 , 4 , 5 , 6 , 3 , 6 , 2 , 12 , 3 , 1 , 3 , 9 , 2 , 4 , 3 , 4 , 1 , 5 , 3 , 3 , 1 , 3 , 7 , 1 , 5 , 1 , 1 , 1 , 1 , 2 ,
3386
3 , 4 , 5 , 2 , 3 , 2 , 6 , 1 , 1 , 2 , 1 , 7 , 1 , 7 , 3 , 4 , 5 , 15 , 2 , 2 , 1 , 5 , 3 , 22 , 19 , 2 , 1 , 1 , 1 , 1 , 2 , 5 , 1 , 1 , 1 , 6 , 1 , 1 , 12 , 8 , 2 , 9 , 18 , 22 , 4 , 1 , 1 , 5 , 1 , 16 , 1 , 2 , 7 , 10 , 15 , 1 , 1 , 6 , 2 , 4 , 1 , 2 , 4 , 1 , 6 ,
3387
1 , 1 , 3 , 2 , 4 , 1 , 6 , 4 , 5 , 1 , 2 , 1 , 1 , 2 , 1 , 10 , 3 , 1 , 3 , 2 , 1 , 9 , 3 , 2 , 5 , 7 , 2 , 19 , 4 , 3 , 6 , 1 , 1 , 1 , 1 , 1 , 4 , 3 , 2 , 1 , 1 , 1 , 2 , 5 , 3 , 1 , 1 , 1 , 2 , 2 , 1 , 1 , 2 , 1 , 1 , 2 , 1 , 3 , 1 , 1 , 1 , 3 , 7 , 1 , 4 , 1 , 1 , 2 , 1 ,
3388
1 , 2 , 1 , 2 , 4 , 4 , 3 , 8 , 1 , 1 , 1 , 2 , 1 , 3 , 5 , 1 , 3 , 1 , 3 , 4 , 6 , 2 , 2 , 14 , 4 , 6 , 6 , 11 , 9 , 1 , 15 , 3 , 1 , 28 , 5 , 2 , 5 , 5 , 3 , 1 , 3 , 4 , 5 , 4 , 6 , 14 , 3 , 2 , 3 , 5 , 21 , 2 , 7 , 20 , 10 , 1 , 2 , 19 , 2 , 4 , 28 , 28 , 2 , 3 ,
3389
2 , 1 , 14 , 4 , 1 , 26 , 28 , 42 , 12 , 40 , 3 , 52 , 79 , 5 , 14 , 17 , 3 , 2 , 2 , 11 , 3 , 4 , 6 , 3 , 1 , 8 , 2 , 23 , 4 , 5 , 8 , 10 , 4 , 2 , 7 , 3 , 5 , 1 , 1 , 6 , 3 , 1 , 2 , 2 , 2 , 5 , 28 , 1 , 1 , 7 , 7 , 20 , 5 , 3 , 29 , 3 , 17 , 26 , 1 , 8 , 4 ,
3390
27 , 3 , 6 , 11 , 23 , 5 , 3 , 4 , 6 , 13 , 24 , 16 , 6 , 5 , 10 , 25 , 35 , 7 , 3 , 2 , 3 , 3 , 14 , 3 , 6 , 2 , 6 , 1 , 4 , 2 , 3 , 8 , 2 , 1 , 1 , 3 , 3 , 3 , 4 , 1 , 1 , 13 , 2 , 2 , 4 , 5 , 2 , 1 , 14 , 14 , 1 , 2 , 2 , 1 , 4 , 5 , 2 , 3 , 1 , 14 , 3 , 12 ,
3391
3 , 17 , 2 , 16 , 5 , 1 , 2 , 1 , 8 , 9 , 3 , 19 , 4 , 2 , 2 , 4 , 17 , 25 , 21 , 20 , 28 , 75 , 1 , 10 , 29 , 103 , 4 , 1 , 2 , 1 , 1 , 4 , 2 , 4 , 1 , 2 , 3 , 24 , 2 , 2 , 2 , 1 , 1 , 2 , 1 , 3 , 8 , 1 , 1 , 1 , 2 , 1 , 1 , 3 , 1 , 1 , 1 , 6 , 1 , 5 , 3 , 1 , 1 ,
3392
1 , 3 , 4 , 1 , 1 , 5 , 2 , 1 , 5 , 6 , 13 , 9 , 16 , 1 , 1 , 1 , 1 , 3 , 2 , 3 , 2 , 4 , 5 , 2 , 5 , 2 , 2 , 3 , 7 , 13 , 7 , 2 , 2 , 1 , 1 , 1 , 1 , 2 , 3 , 3 , 2 , 1 , 6 , 4 , 9 , 2 , 1 , 14 , 2 , 14 , 2 , 1 , 18 , 3 , 4 , 14 , 4 , 11 , 41 , 15 , 23 , 15 , 23 ,
3393
176 , 1 , 3 , 4 , 1 , 1 , 1 , 1 , 5 , 3 , 1 , 2 , 3 , 7 , 3 , 1 , 1 , 2 , 1 , 2 , 4 , 4 , 6 , 2 , 4 , 1 , 9 , 7 , 1 , 10 , 5 , 8 , 16 , 29 , 1 , 1 , 2 , 2 , 3 , 1 , 3 , 5 , 2 , 4 , 5 , 4 , 1 , 1 , 2 , 2 , 3 , 3 , 7 , 1 , 6 , 10 , 1 , 17 , 1 , 44 , 4 , 6 , 2 , 1 , 1 , 6 ,
3394
5 , 4 , 2 , 10 , 1 , 6 , 9 , 2 , 8 , 1 , 24 , 1 , 2 , 13 , 7 , 8 , 8 , 2 , 1 , 4 , 1 , 3 , 1 , 3 , 3 , 5 , 2 , 5 , 10 , 9 , 4 , 9 , 12 , 2 , 1 , 6 , 1 , 10 , 1 , 1 , 7 , 7 , 4 , 10 , 8 , 3 , 1 , 13 , 4 , 3 , 1 , 6 , 1 , 3 , 5 , 2 , 1 , 2 , 17 , 16 , 5 , 2 , 16 , 6 ,
3395
1 , 4 , 2 , 1 , 3 , 3 , 6 , 8 , 5 , 11 , 11 , 1 , 3 , 3 , 2 , 4 , 6 , 10 , 9 , 5 , 7 , 4 , 7 , 4 , 7 , 1 , 1 , 4 , 2 , 1 , 3 , 6 , 8 , 7 , 1 , 6 , 11 , 5 , 5 , 3 , 24 , 9 , 4 , 2 , 7 , 13 , 5 , 1 , 8 , 82 , 16 , 61 , 1 , 1 , 1 , 4 , 2 , 2 , 16 , 10 , 3 , 8 , 1 , 1 ,
3396
6 , 4 , 2 , 1 , 3 , 1 , 1 , 1 , 4 , 3 , 8 , 4 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 6 , 3 , 5 , 1 , 1 , 4 , 6 , 9 , 2 , 1 , 1 , 1 , 2 , 1 , 7 , 2 , 1 , 6 , 1 , 5 , 4 , 4 , 3 , 1 , 8 , 1 , 3 , 3 , 1 , 3 , 2 , 2 , 2 , 2 , 3 , 1 , 6 , 1 , 2 , 1 , 2 , 1 , 3 , 7 , 1 , 8 , 2 , 1 , 2 , 1 , 5 ,
3397
2 , 5 , 3 , 5 , 10 , 1 , 2 , 1 , 1 , 3 , 2 , 5 , 11 , 3 , 9 , 3 , 5 , 1 , 1 , 5 , 9 , 1 , 2 , 1 , 5 , 7 , 9 , 9 , 8 , 1 , 3 , 3 , 3 , 6 , 8 , 2 , 3 , 2 , 1 , 1 , 32 , 6 , 1 , 2 , 15 , 9 , 3 , 7 , 13 , 1 , 3 , 10 , 13 , 2 , 14 , 1 , 13 , 10 , 2 , 1 , 3 , 10 , 4 , 15 ,
3398
2 , 15 , 15 , 10 , 1 , 3 , 9 , 6 , 9 , 32 , 25 , 26 , 47 , 7 , 3 , 2 , 3 , 1 , 6 , 3 , 4 , 3 , 2 , 8 , 5 , 4 , 1 , 9 , 4 , 2 , 2 , 19 , 10 , 6 , 2 , 3 , 8 , 1 , 2 , 2 , 4 , 2 , 1 , 9 , 4 , 4 , 4 , 6 , 4 , 8 , 9 , 2 , 3 , 1 , 1 , 1 , 1 , 3 , 5 , 5 , 1 , 3 , 8 , 4 , 6 ,
3399
2 , 1 , 4 , 12 , 1 , 5 , 3 , 7 , 13 , 2 , 5 , 8 , 1 , 6 , 1 , 2 , 5 , 14 , 6 , 1 , 5 , 2 , 4 , 8 , 15 , 5 , 1 , 23 , 6 , 62 , 2 , 10 , 1 , 1 , 8 , 1 , 2 , 2 , 10 , 4 , 2 , 2 , 9 , 2 , 1 , 1 , 3 , 2 , 3 , 1 , 5 , 3 , 3 , 2 , 1 , 3 , 8 , 1 , 1 , 1 , 11 , 3 , 1 , 1 , 4 ,
3400
3 , 7 , 1 , 14 , 1 , 2 , 3 , 12 , 5 , 2 , 5 , 1 , 6 , 7 , 5 , 7 , 14 , 11 , 1 , 3 , 1 , 8 , 9 , 12 , 2 , 1 , 11 , 8 , 4 , 4 , 2 , 6 , 10 , 9 , 13 , 1 , 1 , 3 , 1 , 5 , 1 , 3 , 2 , 4 , 4 , 1 , 18 , 2 , 3 , 14 , 11 , 4 , 29 , 4 , 2 , 7 , 1 , 3 , 13 , 9 , 2 , 2 , 5 ,
3401
3 , 5 , 20 , 7 , 16 , 8 , 5 , 72 , 34 , 6 , 4 , 22 , 12 , 12 , 28 , 45 , 36 , 9 , 7 , 39 , 9 , 191 , 1 , 1 , 1 , 4 , 11 , 8 , 4 , 9 , 2 , 3 , 22 , 1 , 1 , 1 , 1 , 4 , 17 , 1 , 7 , 7 , 1 , 11 , 31 , 10 , 2 , 4 , 8 , 2 , 3 , 2 , 1 , 4 , 2 , 16 , 4 , 32 , 2 ,
3402
3 , 19 , 13 , 4 , 9 , 1 , 5 , 2 , 14 , 8 , 1 , 1 , 3 , 6 , 19 , 6 , 5 , 1 , 16 , 6 , 2 , 10 , 8 , 5 , 1 , 2 , 3 , 1 , 5 , 5 , 1 , 11 , 6 , 6 , 1 , 3 , 3 , 2 , 6 , 3 , 8 , 1 , 1 , 4 , 10 , 7 , 5 , 7 , 7 , 5 , 8 , 9 , 2 , 1 , 3 , 4 , 1 , 1 , 3 , 1 , 3 , 3 , 2 , 6 , 16 ,
3403
1 , 4 , 6 , 3 , 1 , 10 , 6 , 1 , 3 , 15 , 2 , 9 , 2 , 10 , 25 , 13 , 9 , 16 , 6 , 2 , 2 , 10 , 11 , 4 , 3 , 9 , 1 , 2 , 6 , 6 , 5 , 4 , 30 , 40 , 1 , 10 , 7 , 12 , 14 , 33 , 6 , 3 , 6 , 7 , 3 , 1 , 3 , 1 , 11 , 14 , 4 , 9 , 5 , 12 , 11 , 49 , 18 , 51 , 31 ,
3404
140 , 31 , 2 , 2 , 1 , 5 , 1 , 8 , 1 , 10 , 1 , 4 , 4 , 3 , 24 , 1 , 10 , 1 , 3 , 6 , 6 , 16 , 3 , 4 , 5 , 2 , 1 , 4 , 2 , 57 , 10 , 6 , 22 , 2 , 22 , 3 , 7 , 22 , 6 , 10 , 11 , 36 , 18 , 16 , 33 , 36 , 2 , 5 , 5 , 1 , 1 , 1 , 4 , 10 , 1 , 4 , 13 , 2 , 7 ,
3405
5 , 2 , 9 , 3 , 4 , 1 , 7 , 43 , 3 , 7 , 3 , 9 , 14 , 7 , 9 , 1 , 11 , 1 , 1 , 3 , 7 , 4 , 18 , 13 , 1 , 14 , 1 , 3 , 6 , 10 , 73 , 2 , 2 , 30 , 6 , 1 , 11 , 18 , 19 , 13 , 22 , 3 , 46 , 42 , 37 , 89 , 7 , 3 , 16 , 34 , 2 , 2 , 3 , 9 , 1 , 7 , 1 , 1 , 1 , 2 ,
3406
2 , 4 , 10 , 7 , 3 , 10 , 3 , 9 , 5 , 28 , 9 , 2 , 6 , 13 , 7 , 3 , 1 , 3 , 10 , 2 , 7 , 2 , 11 , 3 , 6 , 21 , 54 , 85 , 2 , 1 , 4 , 2 , 2 , 1 , 39 , 3 , 21 , 2 , 2 , 5 , 1 , 1 , 1 , 4 , 1 , 1 , 3 , 4 , 15 , 1 , 3 , 2 , 4 , 4 , 2 , 3 , 8 , 2 , 20 , 1 , 8 , 7 , 13 ,
3407
4 , 1 , 26 , 6 , 2 , 9 , 34 , 4 , 21 , 52 , 10 , 4 , 4 , 1 , 5 , 12 , 2 , 11 , 1 , 7 , 2 , 30 , 12 , 44 , 2 , 30 , 1 , 1 , 3 , 6 , 16 , 9 , 17 , 39 , 82 , 2 , 2 , 24 , 7 , 1 , 7 , 3 , 16 , 9 , 14 , 44 , 2 , 1 , 2 , 1 , 2 , 3 , 5 , 2 , 4 , 1 , 6 , 7 , 5 , 3 ,
3408
2 , 6 , 1 , 11 , 5 , 11 , 2 , 1 , 18 , 19 , 8 , 1 , 3 , 24 , 29 , 2 , 1 , 3 , 5 , 2 , 2 , 1 , 13 , 6 , 5 , 1 , 46 , 11 , 3 , 5 , 1 , 1 , 5 , 8 , 2 , 10 , 6 , 12 , 6 , 3 , 7 , 11 , 2 , 4 , 16 , 13 , 2 , 5 , 1 , 1 , 2 , 2 , 5 , 2 , 28 , 5 , 2 , 23 , 10 , 8 , 4 ,
3409
4 , 22 , 39 , 95 , 38 , 8 , 14 , 9 , 5 , 1 , 13 , 5 , 4 , 3 , 13 , 12 , 11 , 1 , 9 , 1 , 27 , 37 , 2 , 5 , 4 , 4 , 63 , 211 , 95 , 2 , 2 , 2 , 1 , 3 , 5 , 2 , 1 , 1 , 2 , 2 , 1 , 1 , 1 , 3 , 2 , 4 , 1 , 2 , 1 , 1 , 5 , 2 , 2 , 1 , 1 , 2 , 3 , 1 , 3 , 1 , 1 , 1 ,
3410
3 , 1 , 4 , 2 , 1 , 3 , 6 , 1 , 1 , 3 , 7 , 15 , 5 , 3 , 2 , 5 , 3 , 9 , 11 , 4 , 2 , 22 , 1 , 6 , 3 , 8 , 7 , 1 , 4 , 28 , 4 , 16 , 3 , 3 , 25 , 4 , 4 , 27 , 27 , 1 , 4 , 1 , 2 , 2 , 7 , 1 , 3 , 5 , 2 , 28 , 8 , 2 , 14 , 1 , 8 , 6 , 16 , 25 , 3 , 3 , 3 , 14 , 3 ,
3411
3 , 1 , 1 , 2 , 1 , 4 , 6 , 3 , 8 , 4 , 1 , 1 , 1 , 2 , 3 , 6 , 10 , 6 , 2 , 3 , 18 , 3 , 2 , 5 , 5 , 4 , 3 , 1 , 5 , 2 , 5 , 4 , 23 , 7 , 6 , 12 , 6 , 4 , 17 , 11 , 9 , 5 , 1 , 1 , 10 , 5 , 12 , 1 , 1 , 11 , 26 , 33 , 7 , 3 , 6 , 1 , 17 , 7 , 1 , 5 , 12 , 1 , 11 ,
3412
2 , 4 , 1 , 8 , 14 , 17 , 23 , 1 , 2 , 1 , 7 , 8 , 16 , 11 , 9 , 6 , 5 , 2 , 6 , 4 , 16 , 2 , 8 , 14 , 1 , 11 , 8 , 9 , 1 , 1 , 1 , 9 , 25 , 4 , 11 , 19 , 7 , 2 , 15 , 2 , 12 , 8 , 52 , 7 , 5 , 19 , 2 , 16 , 4 , 36 , 8 , 1 , 16 , 8 , 24 , 26 , 4 , 6 , 2 , 9 ,
3413
5 , 4 , 36 , 3 , 28 , 12 , 25 , 15 , 37 , 27 , 17 , 12 , 59 , 38 , 5 , 32 , 127 , 1 , 2 , 9 , 17 , 14 , 4 , 1 , 2 , 1 , 1 , 8 , 11 , 50 , 4 , 14 , 2 , 19 , 16 , 4 , 17 , 5 , 4 , 5 , 26 , 12 , 45 , 2 , 23 , 45 , 104 , 30 , 12 , 8 , 3 , 10 , 2 , 2 ,
3414
3 , 3 , 1 , 4 , 20 , 7 , 2 , 9 , 6 , 15 , 2 , 20 , 1 , 3 , 16 , 4 , 11 , 15 , 6 , 134 , 2 , 5 , 59 , 1 , 2 , 2 , 2 , 1 , 9 , 17 , 3 , 26 , 137 , 10 , 211 , 59 , 1 , 2 , 4 , 1 , 4 , 1 , 1 , 1 , 2 , 6 , 2 , 3 , 1 , 1 , 2 , 3 , 2 , 3 , 1 , 3 , 4 , 4 , 2 , 3 , 3 ,
3415
1 , 4 , 3 , 1 , 7 , 2 , 2 , 3 , 1 , 2 , 1 , 3 , 3 , 3 , 2 , 2 , 3 , 2 , 1 , 3 , 14 , 6 , 1 , 3 , 2 , 9 , 6 , 15 , 27 , 9 , 34 , 145 , 1 , 1 , 2 , 1 , 1 , 1 , 1 , 2 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 1 , 2 , 1 , 1 , 1 , 2 , 3 , 5 , 8 , 3 , 5 , 2 , 4 , 1 , 3 , 2 , 2 , 2 , 12 ,
3416
4 , 1 , 1 , 1 , 10 , 4 , 5 , 1 , 20 , 4 , 16 , 1 , 15 , 9 , 5 , 12 , 2 , 9 , 2 , 5 , 4 , 2 , 26 , 19 , 7 , 1 , 26 , 4 , 30 , 12 , 15 , 42 , 1 , 6 , 8 , 172 , 1 , 1 , 4 , 2 , 1 , 1 , 11 , 2 , 2 , 4 , 2 , 1 , 2 , 1 , 10 , 8 , 1 , 2 , 1 , 4 , 5 , 1 , 2 , 5 , 1 , 8 ,
3417
4 , 1 , 3 , 4 , 2 , 1 , 6 , 2 , 1 , 3 , 4 , 1 , 2 , 1 , 1 , 1 , 1 , 12 , 5 , 7 , 2 , 4 , 3 , 1 , 1 , 1 , 3 , 3 , 6 , 1 , 2 , 2 , 3 , 3 , 3 , 2 , 1 , 2 , 12 , 14 , 11 , 6 , 6 , 4 , 12 , 2 , 8 , 1 , 7 , 10 , 1 , 35 , 7 , 4 , 13 , 15 , 4 , 3 , 23 , 21 , 28 , 52 , 5 ,
3418
26 , 5 , 6 , 1 , 7 , 10 , 2 , 7 , 53 , 3 , 2 , 1 , 1 , 1 , 2 , 163 , 532 , 1 , 10 , 11 , 1 , 3 , 3 , 4 , 8 , 2 , 8 , 6 , 2 , 2 , 23 , 22 , 4 , 2 , 2 , 4 , 2 , 1 , 3 , 1 , 3 , 3 , 5 , 9 , 8 , 2 , 1 , 2 , 8 , 1 , 10 , 2 , 12 , 21 , 20 , 15 , 105 , 2 , 3 , 1 , 1 ,
3419
3 , 2 , 3 , 1 , 1 , 2 , 5 , 1 , 4 , 15 , 11 , 19 , 1 , 1 , 1 , 1 , 5 , 4 , 5 , 1 , 1 , 2 , 5 , 3 , 5 , 12 , 1 , 2 , 5 , 1 , 11 , 1 , 1 , 15 , 9 , 1 , 4 , 5 , 3 , 26 , 8 , 2 , 1 , 3 , 1 , 1 , 15 , 19 , 2 , 12 , 1 , 2 , 5 , 2 , 7 , 2 , 19 , 2 , 20 , 6 , 26 , 7 , 5 ,
3420
2 , 2 , 7 , 34 , 21 , 13 , 70 , 2 , 128 , 1 , 1 , 2 , 1 , 1 , 2 , 1 , 1 , 3 , 2 , 2 , 2 , 15 , 1 , 4 , 1 , 3 , 4 , 42 , 10 , 6 , 1 , 49 , 85 , 8 , 1 , 2 , 1 , 1 , 4 , 4 , 2 , 3 , 6 , 1 , 5 , 7 , 4 , 3 , 211 , 4 , 1 , 2 , 1 , 2 , 5 , 1 , 2 , 4 , 2 , 2 , 6 , 5 , 6 ,
3421
10 , 3 , 4 , 48 , 100 , 6 , 2 , 16 , 296 , 5 , 27 , 387 , 2 , 2 , 3 , 7 , 16 , 8 , 5 , 38 , 15 , 39 , 21 , 9 , 10 , 3 , 7 , 59 , 13 , 27 , 21 , 47 , 5 , 21 , 6
3422
} ;
3423
static ImWchar base_ranges[ ] =
3424
{
3425
0x0020 , 0x00FF ,
3426
0x2000 , 0x206F ,
3427
0x3000 , 0x30FF ,
3428
0x31F0 , 0x31FF ,
3429
0xFF00 , 0xFFEF ,
3430
0xFFFD , 0xFFFD
3431
} ;
3432
static ImWchar full_ranges[ IM_ARRAYSIZE ( base_ranges ) + IM_ARRAYSIZE ( accumulative_offsets_from_0x4E00 ) * 2 + 1 ] = { 0 } ;
3433
if ( ! full_ranges[ 0 ] )
3434
{
3435
memcpy ( full_ranges, base_ranges, sizeof ( base_ranges ) ) ;
3436
UnpackAccumulativeOffsetsIntoRanges ( 0x4E00 , accumulative_offsets_from_0x4E00, IM_ARRAYSIZE ( accumulative_offsets_from_0x4E00 ) , full_ranges + IM_ARRAYSIZE ( base_ranges ) ) ;
3437
}
3438
return & full_ranges[ 0 ] ;
3439
}
3440
3441
const ImWchar* ImFontAtlas:: GetGlyphRangesJapanese ( )
3442
{
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
static const short accumulative_offsets_from_0x4E00[ ] =
3464
{
3465
0 , 1 , 2 , 4 , 1 , 1 , 1 , 1 , 2 , 1 , 3 , 3 , 2 , 2 , 1 , 5 , 3 , 5 , 7 , 5 , 6 , 1 , 2 , 1 , 7 , 2 , 6 , 3 , 1 , 8 , 1 , 1 , 4 , 1 , 1 , 18 , 2 , 11 , 2 , 6 , 2 , 1 , 2 , 1 , 5 , 1 , 2 , 1 , 3 , 1 , 2 , 1 , 2 , 3 , 3 , 1 , 1 , 2 , 3 , 1 , 1 , 1 , 12 , 7 , 9 , 1 , 4 , 5 , 1 ,
3466
1 , 2 , 1 , 10 , 1 , 1 , 9 , 2 , 2 , 4 , 5 , 6 , 9 , 3 , 1 , 1 , 1 , 1 , 9 , 3 , 18 , 5 , 2 , 2 , 2 , 2 , 1 , 6 , 3 , 7 , 1 , 1 , 1 , 1 , 2 , 2 , 4 , 2 , 1 , 23 , 2 , 10 , 4 , 3 , 5 , 2 , 4 , 10 , 2 , 4 , 13 , 1 , 6 , 1 , 9 , 3 , 1 , 1 , 6 , 6 , 7 , 6 , 3 , 1 , 2 , 11 , 3 ,
3467
2 , 2 , 3 , 2 , 15 , 2 , 2 , 5 , 4 , 3 , 6 , 4 , 1 , 2 , 5 , 2 , 12 , 16 , 6 , 13 , 9 , 13 , 2 , 1 , 1 , 7 , 16 , 4 , 7 , 1 , 19 , 1 , 5 , 1 , 2 , 2 , 7 , 7 , 8 , 2 , 6 , 5 , 4 , 9 , 18 , 7 , 4 , 5 , 9 , 13 , 11 , 8 , 15 , 2 , 1 , 1 , 1 , 2 , 1 , 2 , 2 , 1 , 2 , 2 , 8 ,
3468
2 , 9 , 3 , 3 , 1 , 1 , 4 , 4 , 1 , 1 , 1 , 4 , 9 , 1 , 4 , 3 , 5 , 5 , 2 , 7 , 5 , 3 , 4 , 8 , 2 , 1 , 13 , 2 , 3 , 3 , 1 , 14 , 1 , 1 , 4 , 5 , 1 , 3 , 6 , 1 , 5 , 2 , 1 , 1 , 3 , 3 , 3 , 3 , 1 , 1 , 2 , 7 , 6 , 6 , 7 , 1 , 4 , 7 , 6 , 1 , 1 , 1 , 1 , 1 , 12 , 3 , 3 , 9 , 5 ,
3469
2 , 6 , 1 , 5 , 6 , 1 , 2 , 3 , 18 , 2 , 4 , 14 , 4 , 1 , 3 , 6 , 1 , 1 , 6 , 3 , 5 , 5 , 3 , 2 , 2 , 2 , 2 , 12 , 3 , 1 , 4 , 2 , 3 , 2 , 3 , 11 , 1 , 7 , 4 , 1 , 2 , 1 , 3 , 17 , 1 , 9 , 1 , 24 , 1 , 1 , 4 , 2 , 2 , 4 , 1 , 2 , 7 , 1 , 1 , 1 , 3 , 1 , 2 , 2 , 4 , 15 , 1 ,
3470
1 , 2 , 1 , 1 , 2 , 1 , 5 , 2 , 5 , 20 , 2 , 5 , 9 , 1 , 10 , 8 , 7 , 6 , 1 , 1 , 1 , 1 , 1 , 1 , 6 , 2 , 1 , 2 , 8 , 1 , 1 , 1 , 1 , 5 , 1 , 1 , 3 , 1 , 1 , 1 , 1 , 3 , 1 , 1 , 12 , 4 , 1 , 3 , 1 , 1 , 1 , 1 , 1 , 10 , 3 , 1 , 7 , 5 , 13 , 1 , 2 , 3 , 4 , 6 , 1 , 1 , 30 ,
3471
2 , 9 , 9 , 1 , 15 , 38 , 11 , 3 , 1 , 8 , 24 , 7 , 1 , 9 , 8 , 10 , 2 , 1 , 9 , 31 , 2 , 13 , 6 , 2 , 9 , 4 , 49 , 5 , 2 , 15 , 2 , 1 , 10 , 2 , 1 , 1 , 1 , 2 , 2 , 6 , 15 , 30 , 35 , 3 , 14 , 18 , 8 , 1 , 16 , 10 , 28 , 12 , 19 , 45 , 38 , 1 , 3 , 2 , 3 ,
3472
13 , 2 , 1 , 7 , 3 , 6 , 5 , 3 , 4 , 3 , 1 , 5 , 7 , 8 , 1 , 5 , 3 , 18 , 5 , 3 , 6 , 1 , 21 , 4 , 24 , 9 , 24 , 40 , 3 , 14 , 3 , 21 , 3 , 2 , 1 , 2 , 4 , 2 , 3 , 1 , 15 , 15 , 6 , 5 , 1 , 1 , 3 , 1 , 5 , 6 , 1 , 9 , 7 , 3 , 3 , 2 , 1 , 4 , 3 , 8 , 21 , 5 , 16 , 4 ,
3473
5 , 2 , 10 , 11 , 11 , 3 , 6 , 3 , 2 , 9 , 3 , 6 , 13 , 1 , 2 , 1 , 1 , 1 , 1 , 11 , 12 , 6 , 6 , 1 , 4 , 2 , 6 , 5 , 2 , 1 , 1 , 3 , 3 , 6 , 13 , 3 , 1 , 1 , 5 , 1 , 2 , 3 , 3 , 14 , 2 , 1 , 2 , 2 , 2 , 5 , 1 , 9 , 5 , 1 , 1 , 6 , 12 , 3 , 12 , 3 , 4 , 13 , 2 , 14 ,
3474
2 , 8 , 1 , 17 , 5 , 1 , 16 , 4 , 2 , 2 , 21 , 8 , 9 , 6 , 23 , 20 , 12 , 25 , 19 , 9 , 38 , 8 , 3 , 21 , 40 , 25 , 33 , 13 , 4 , 3 , 1 , 4 , 1 , 2 , 4 , 1 , 2 , 5 , 26 , 2 , 1 , 1 , 2 , 1 , 3 , 6 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 3 , 1 , 1 , 1 , 9 , 2 , 3 , 1 , 1 ,
3475
1 , 3 , 6 , 3 , 2 , 1 , 1 , 6 , 6 , 1 , 8 , 2 , 2 , 2 , 1 , 4 , 1 , 2 , 3 , 2 , 7 , 3 , 2 , 4 , 1 , 2 , 1 , 2 , 2 , 1 , 1 , 1 , 1 , 1 , 3 , 1 , 2 , 5 , 4 , 10 , 9 , 4 , 9 , 1 , 1 , 1 , 1 , 1 , 1 , 5 , 3 , 2 , 1 , 6 , 4 , 9 , 6 , 1 , 10 , 2 , 31 , 17 , 8 , 3 , 7 , 5 , 40 , 1 ,
3476
7 , 7 , 1 , 6 , 5 , 2 , 10 , 7 , 8 , 4 , 15 , 39 , 25 , 6 , 28 , 47 , 18 , 10 , 7 , 1 , 3 , 1 , 1 , 2 , 1 , 1 , 1 , 3 , 3 , 3 , 1 , 1 , 1 , 3 , 4 , 2 , 1 , 4 , 1 , 3 , 6 , 10 , 7 , 8 , 6 , 2 , 2 , 1 , 3 , 3 , 2 , 5 , 8 , 7 , 9 , 12 , 2 , 15 , 1 , 1 , 4 , 1 , 2 , 1 , 1 ,
3477
1 , 3 , 2 , 1 , 3 , 3 , 5 , 6 , 2 , 3 , 2 , 10 , 1 , 4 , 2 , 8 , 1 , 1 , 1 , 11 , 6 , 1 , 21 , 4 , 16 , 3 , 1 , 3 , 1 , 4 , 2 , 3 , 6 , 5 , 1 , 3 , 1 , 1 , 3 , 3 , 4 , 6 , 1 , 1 , 10 , 4 , 2 , 7 , 10 , 4 , 7 , 4 , 2 , 9 , 4 , 3 , 1 , 1 , 1 , 4 , 1 , 8 , 3 , 4 , 1 , 3 , 1 ,
3478
6 , 1 , 4 , 2 , 1 , 4 , 7 , 2 , 1 , 8 , 1 , 4 , 5 , 1 , 1 , 2 , 2 , 4 , 6 , 2 , 7 , 1 , 10 , 1 , 1 , 3 , 4 , 11 , 10 , 8 , 21 , 4 , 6 , 1 , 3 , 5 , 2 , 1 , 2 , 28 , 5 , 5 , 2 , 3 , 13 , 1 , 2 , 3 , 1 , 4 , 2 , 1 , 5 , 20 , 3 , 8 , 11 , 1 , 3 , 3 , 3 , 1 , 8 , 10 , 9 , 2 ,
3479
10 , 9 , 2 , 3 , 1 , 1 , 2 , 4 , 1 , 8 , 3 , 6 , 1 , 7 , 8 , 6 , 11 , 1 , 4 , 29 , 8 , 4 , 3 , 1 , 2 , 7 , 13 , 1 , 4 , 1 , 6 , 2 , 6 , 12 , 12 , 2 , 20 , 3 , 2 , 3 , 6 , 4 , 8 , 9 , 2 , 7 , 34 , 5 , 1 , 18 , 6 , 1 , 1 , 4 , 4 , 5 , 7 , 9 , 1 , 2 , 2 , 4 , 3 , 4 , 1 , 7 ,
3480
2 , 2 , 2 , 6 , 2 , 3 , 25 , 5 , 3 , 6 , 1 , 4 , 6 , 7 , 4 , 2 , 1 , 4 , 2 , 13 , 6 , 4 , 4 , 3 , 1 , 5 , 3 , 4 , 4 , 3 , 2 , 1 , 1 , 4 , 1 , 2 , 1 , 1 , 3 , 1 , 11 , 1 , 6 , 3 , 1 , 7 , 3 , 6 , 2 , 8 , 8 , 6 , 9 , 3 , 4 , 11 , 3 , 2 , 10 , 12 , 2 , 5 , 11 , 1 , 6 , 4 , 5 ,
3481
3 , 1 , 8 , 5 , 4 , 6 , 6 , 3 , 5 , 1 , 1 , 3 , 2 , 1 , 2 , 2 , 6 , 17 , 12 , 1 , 10 , 1 , 6 , 12 , 1 , 6 , 6 , 19 , 9 , 6 , 16 , 1 , 13 , 4 , 4 , 15 , 7 , 17 , 6 , 11 , 9 , 15 , 12 , 6 , 7 , 2 , 1 , 2 , 2 , 15 , 9 , 3 , 21 , 4 , 6 , 49 , 18 , 7 , 3 , 2 , 3 , 1 ,
3482
6 , 8 , 2 , 2 , 6 , 2 , 9 , 1 , 3 , 6 , 4 , 4 , 1 , 2 , 16 , 2 , 5 , 2 , 1 , 6 , 2 , 3 , 5 , 3 , 1 , 2 , 5 , 1 , 2 , 1 , 9 , 3 , 1 , 8 , 6 , 4 , 8 , 11 , 3 , 1 , 1 , 1 , 1 , 3 , 1 , 13 , 8 , 4 , 1 , 3 , 2 , 2 , 1 , 4 , 1 , 11 , 1 , 5 , 2 , 1 , 5 , 2 , 5 , 8 , 6 , 1 , 1 , 7 ,
3483
4 , 3 , 8 , 3 , 2 , 7 , 2 , 1 , 5 , 1 , 5 , 2 , 4 , 7 , 6 , 2 , 8 , 5 , 1 , 11 , 4 , 5 , 3 , 6 , 18 , 1 , 2 , 13 , 3 , 3 , 1 , 21 , 1 , 1 , 4 , 1 , 4 , 1 , 1 , 1 , 8 , 1 , 2 , 2 , 7 , 1 , 2 , 4 , 2 , 2 , 9 , 2 , 1 , 1 , 1 , 4 , 3 , 6 , 3 , 12 , 5 , 1 , 1 , 1 , 5 , 6 , 3 , 2 ,
3484
4 , 8 , 2 , 2 , 4 , 2 , 7 , 1 , 8 , 9 , 5 , 2 , 3 , 2 , 1 , 3 , 2 , 13 , 7 , 14 , 6 , 5 , 1 , 1 , 2 , 1 , 4 , 2 , 23 , 2 , 1 , 1 , 6 , 3 , 1 , 4 , 1 , 15 , 3 , 1 , 7 , 3 , 9 , 14 , 1 , 3 , 1 , 4 , 1 , 1 , 5 , 8 , 1 , 3 , 8 , 3 , 8 , 15 , 11 , 4 , 14 , 4 , 4 , 2 , 5 , 5 ,
3485
1 , 7 , 1 , 6 , 14 , 7 , 7 , 8 , 5 , 15 , 4 , 8 , 6 , 5 , 6 , 2 , 1 , 13 , 1 , 20 , 15 , 11 , 9 , 2 , 5 , 6 , 2 , 11 , 2 , 6 , 2 , 5 , 1 , 5 , 8 , 4 , 13 , 19 , 25 , 4 , 1 , 1 , 11 , 1 , 34 , 2 , 5 , 9 , 14 , 6 , 2 , 2 , 6 , 1 , 1 , 14 , 1 , 3 , 14 , 13 , 1 , 6 ,
3486
12 , 21 , 14 , 14 , 6 , 32 , 17 , 8 , 32 , 9 , 28 , 1 , 2 , 4 , 11 , 8 , 3 , 1 , 14 , 2 , 5 , 15 , 1 , 1 , 1 , 1 , 3 , 6 , 4 , 1 , 3 , 4 , 11 , 3 , 1 , 1 , 11 , 30 , 1 , 5 , 1 , 4 , 1 , 5 , 8 , 1 , 1 , 3 , 2 , 4 , 3 , 17 , 35 , 2 , 6 , 12 , 17 , 3 , 1 , 6 , 2 ,
3487
1 , 1 , 12 , 2 , 7 , 3 , 3 , 2 , 1 , 16 , 2 , 8 , 3 , 6 , 5 , 4 , 7 , 3 , 3 , 8 , 1 , 9 , 8 , 5 , 1 , 2 , 1 , 3 , 2 , 8 , 1 , 2 , 9 , 12 , 1 , 1 , 2 , 3 , 8 , 3 , 24 , 12 , 4 , 3 , 7 , 5 , 8 , 3 , 3 , 3 , 3 , 3 , 3 , 1 , 23 , 10 , 3 , 1 , 2 , 2 , 6 , 3 , 1 , 16 , 1 , 16 ,
3488
22 , 3 , 10 , 4 , 11 , 6 , 9 , 7 , 7 , 3 , 6 , 2 , 2 , 2 , 4 , 10 , 2 , 1 , 1 , 2 , 8 , 7 , 1 , 6 , 4 , 1 , 3 , 3 , 3 , 5 , 10 , 12 , 12 , 2 , 3 , 12 , 8 , 15 , 1 , 1 , 16 , 6 , 6 , 1 , 5 , 9 , 11 , 4 , 11 , 4 , 2 , 6 , 12 , 1 , 17 , 5 , 13 , 1 , 4 , 9 , 5 , 1 , 11 ,
3489
2 , 1 , 8 , 1 , 5 , 7 , 28 , 8 , 3 , 5 , 10 , 2 , 17 , 3 , 38 , 22 , 1 , 2 , 18 , 12 , 10 , 4 , 38 , 18 , 1 , 4 , 44 , 19 , 4 , 1 , 8 , 4 , 1 , 12 , 1 , 4 , 31 , 12 , 1 , 14 , 7 , 75 , 7 , 5 , 10 , 6 , 6 , 13 , 3 , 2 , 11 , 11 , 3 , 2 , 5 , 28 , 15 , 6 , 18 ,
3490
18 , 5 , 6 , 4 , 3 , 16 , 1 , 7 , 18 , 7 , 36 , 3 , 5 , 3 , 1 , 7 , 1 , 9 , 1 , 10 , 7 , 2 , 4 , 2 , 6 , 2 , 9 , 7 , 4 , 3 , 32 , 12 , 3 , 7 , 10 , 2 , 23 , 16 , 3 , 1 , 12 , 3 , 31 , 4 , 11 , 1 , 3 , 8 , 9 , 5 , 1 , 30 , 15 , 6 , 12 , 3 , 2 , 2 , 11 , 19 , 9 ,
3491
14 , 2 , 6 , 2 , 3 , 19 , 13 , 17 , 5 , 3 , 3 , 25 , 3 , 14 , 1 , 1 , 1 , 36 , 1 , 3 , 2 , 19 , 3 , 13 , 36 , 9 , 13 , 31 , 6 , 4 , 16 , 34 , 2 , 5 , 4 , 2 , 3 , 3 , 5 , 1 , 1 , 1 , 4 , 3 , 1 , 17 , 3 , 2 , 3 , 5 , 3 , 1 , 3 , 2 , 3 , 5 , 6 , 3 , 12 , 11 , 1 , 3 ,
3492
1 , 2 , 26 , 7 , 12 , 7 , 2 , 14 , 3 , 3 , 7 , 7 , 11 , 25 , 25 , 28 , 16 , 4 , 36 , 1 , 2 , 1 , 6 , 2 , 1 , 9 , 3 , 27 , 17 , 4 , 3 , 4 , 13 , 4 , 1 , 3 , 2 , 2 , 1 , 10 , 4 , 2 , 4 , 6 , 3 , 8 , 2 , 1 , 18 , 1 , 1 , 24 , 2 , 2 , 4 , 33 , 2 , 3 , 63 , 7 , 1 , 6 ,
3493
40 , 7 , 3 , 4 , 4 , 2 , 4 , 15 , 18 , 1 , 16 , 1 , 1 , 11 , 2 , 41 , 14 , 1 , 3 , 18 , 13 , 3 , 2 , 4 , 16 , 2 , 17 , 7 , 15 , 24 , 7 , 18 , 13 , 44 , 2 , 2 , 3 , 6 , 1 , 1 , 7 , 5 , 1 , 7 , 1 , 4 , 3 , 3 , 5 , 10 , 8 , 2 , 3 , 1 , 8 , 1 , 1 , 27 , 4 , 2 , 1 ,
3494
12 , 1 , 2 , 1 , 10 , 6 , 1 , 6 , 7 , 5 , 2 , 3 , 7 , 11 , 5 , 11 , 3 , 6 , 6 , 2 , 3 , 15 , 4 , 9 , 1 , 1 , 2 , 1 , 2 , 11 , 2 , 8 , 12 , 8 , 5 , 4 , 2 , 3 , 1 , 5 , 2 , 2 , 1 , 14 , 1 , 12 , 11 , 4 , 1 , 11 , 17 , 17 , 4 , 3 , 2 , 5 , 5 , 7 , 3 , 1 , 5 , 9 , 9 , 8 ,
3495
2 , 5 , 6 , 6 , 13 , 13 , 2 , 1 , 2 , 6 , 1 , 2 , 2 , 49 , 4 , 9 , 1 , 2 , 10 , 16 , 7 , 8 , 4 , 3 , 2 , 23 , 4 , 58 , 3 , 29 , 1 , 14 , 19 , 19 , 11 , 11 , 2 , 7 , 5 , 1 , 3 , 4 , 6 , 2 , 18 , 5 , 12 , 12 , 17 , 17 , 3 , 3 , 2 , 4 , 1 , 6 , 2 , 3 , 4 , 3 , 1 ,
3496
1 , 1 , 1 , 5 , 1 , 1 , 9 , 1 , 3 , 1 , 3 , 6 , 1 , 8 , 1 , 1 , 2 , 6 , 4 , 14 , 3 , 1 , 4 , 11 , 4 , 1 , 3 , 32 , 1 , 2 , 4 , 13 , 4 , 1 , 2 , 4 , 2 , 1 , 3 , 1 , 11 , 1 , 4 , 2 , 1 , 4 , 4 , 6 , 3 , 5 , 1 , 6 , 5 , 7 , 6 , 3 , 23 , 3 , 5 , 3 , 5 , 3 , 3 , 13 , 3 , 9 , 10 ,
3497
1 , 12 , 10 , 2 , 3 , 18 , 13 , 7 , 160 , 52 , 4 , 2 , 2 , 3 , 2 , 14 , 5 , 4 , 12 , 4 , 6 , 4 , 1 , 20 , 4 , 11 , 6 , 2 , 12 , 27 , 1 , 4 , 1 , 2 , 2 , 7 , 4 , 5 , 2 , 28 , 3 , 7 , 25 , 8 , 3 , 19 , 3 , 6 , 10 , 2 , 2 , 1 , 10 , 2 , 5 , 4 , 1 , 3 , 4 , 1 , 5 ,
3498
3 , 2 , 6 , 9 , 3 , 6 , 2 , 16 , 3 , 3 , 16 , 4 , 5 , 5 , 3 , 2 , 1 , 2 , 16 , 15 , 8 , 2 , 6 , 21 , 2 , 4 , 1 , 22 , 5 , 8 , 1 , 1 , 21 , 11 , 2 , 1 , 11 , 11 , 19 , 13 , 12 , 4 , 2 , 3 , 2 , 3 , 6 , 1 , 8 , 11 , 1 , 4 , 2 , 9 , 5 , 2 , 1 , 11 , 2 , 9 , 1 , 1 , 2 ,
3499
14 , 31 , 9 , 3 , 4 , 21 , 14 , 4 , 8 , 1 , 7 , 2 , 2 , 2 , 5 , 1 , 4 , 20 , 3 , 3 , 4 , 10 , 1 , 11 , 9 , 8 , 2 , 1 , 4 , 5 , 14 , 12 , 14 , 2 , 17 , 9 , 6 , 31 , 4 , 14 , 1 , 20 , 13 , 26 , 5 , 2 , 7 , 3 , 6 , 13 , 2 , 4 , 2 , 19 , 6 , 2 , 2 , 18 , 9 , 3 , 5 ,
3500
12 , 12 , 14 , 4 , 6 , 2 , 3 , 6 , 9 , 5 , 22 , 4 , 5 , 25 , 6 , 4 , 8 , 5 , 2 , 6 , 27 , 2 , 35 , 2 , 16 , 3 , 7 , 8 , 8 , 6 , 6 , 5 , 9 , 17 , 2 , 20 , 6 , 19 , 2 , 13 , 3 , 1 , 1 , 1 , 4 , 17 , 12 , 2 , 14 , 7 , 1 , 4 , 18 , 12 , 38 , 33 , 2 , 10 , 1 , 1 ,
3501
2 , 13 , 14 , 17 , 11 , 50 , 6 , 33 , 20 , 26 , 74 , 16 , 23 , 45 , 50 , 13 , 38 , 33 , 6 , 6 , 7 , 4 , 4 , 2 , 1 , 3 , 2 , 5 , 8 , 7 , 8 , 9 , 3 , 11 , 21 , 9 , 13 , 1 , 3 , 10 , 6 , 7 , 1 , 2 , 2 , 18 , 5 , 5 , 1 , 9 , 9 , 2 , 68 , 9 , 19 , 13 , 2 , 5 ,
3502
1 , 4 , 4 , 7 , 4 , 13 , 3 , 9 , 10 , 21 , 17 , 3 , 26 , 2 , 1 , 5 , 2 , 4 , 5 , 4 , 1 , 7 , 4 , 7 , 3 , 4 , 2 , 1 , 6 , 1 , 1 , 20 , 4 , 1 , 9 , 2 , 2 , 1 , 3 , 3 , 2 , 3 , 2 , 1 , 1 , 1 , 20 , 2 , 3 , 1 , 6 , 2 , 3 , 6 , 2 , 4 , 8 , 1 , 3 , 2 , 10 , 3 , 5 , 3 , 4 , 4 ,
3503
3 , 4 , 16 , 1 , 6 , 1 , 10 , 2 , 4 , 2 , 1 , 1 , 2 , 10 , 11 , 2 , 2 , 3 , 1 , 24 , 31 , 4 , 10 , 10 , 2 , 5 , 12 , 16 , 164 , 15 , 4 , 16 , 7 , 9 , 15 , 19 , 17 , 1 , 2 , 1 , 1 , 5 , 1 , 1 , 1 , 1 , 1 , 3 , 1 , 4 , 3 , 1 , 3 , 1 , 3 , 1 , 2 , 1 , 1 , 3 , 3 , 7 ,
3504
2 , 8 , 1 , 2 , 2 , 2 , 1 , 3 , 4 , 3 , 7 , 8 , 12 , 92 , 2 , 10 , 3 , 1 , 3 , 14 , 5 , 25 , 16 , 42 , 4 , 7 , 7 , 4 , 2 , 21 , 5 , 27 , 26 , 27 , 21 , 25 , 30 , 31 , 2 , 1 , 5 , 13 , 3 , 22 , 5 , 6 , 6 , 11 , 9 , 12 , 1 , 5 , 9 , 7 , 5 , 5 , 22 , 60 , 3 , 5 ,
3505
13 , 1 , 1 , 8 , 1 , 1 , 3 , 3 , 2 , 1 , 9 , 3 , 3 , 18 , 4 , 1 , 2 , 3 , 7 , 6 , 3 , 1 , 2 , 3 , 9 , 1 , 3 , 1 , 3 , 2 , 1 , 3 , 1 , 1 , 1 , 2 , 1 , 11 , 3 , 1 , 6 , 9 , 1 , 3 , 2 , 3 , 1 , 2 , 1 , 5 , 1 , 1 , 4 , 3 , 4 , 1 , 2 , 2 , 4 , 4 , 1 , 7 , 2 , 1 , 2 , 2 , 3 , 5 , 13 ,
3506
18 , 3 , 4 , 14 , 9 , 9 , 4 , 16 , 3 , 7 , 5 , 8 , 2 , 6 , 48 , 28 , 3 , 1 , 1 , 4 , 2 , 14 , 8 , 2 , 9 , 2 , 1 , 15 , 2 , 4 , 3 , 2 , 10 , 16 , 12 , 8 , 7 , 1 , 1 , 3 , 1 , 1 , 1 , 2 , 7 , 4 , 1 , 6 , 4 , 38 , 39 , 16 , 23 , 7 , 15 , 15 , 3 , 2 , 12 , 7 , 21 ,
3507
37 , 27 , 6 , 5 , 4 , 8 , 2 , 10 , 8 , 8 , 6 , 5 , 1 , 2 , 1 , 3 , 24 , 1 , 16 , 17 , 9 , 23 , 10 , 17 , 6 , 1 , 51 , 55 , 44 , 13 , 294 , 9 , 3 , 6 , 2 , 4 , 2 , 2 , 15 , 1 , 1 , 1 , 13 , 21 , 17 , 68 , 14 , 8 , 9 , 4 , 1 , 4 , 9 , 3 , 11 , 7 , 1 , 1 , 1 ,
3508
5 , 6 , 3 , 2 , 1 , 1 , 1 , 2 , 3 , 8 , 1 , 2 , 2 , 4 , 1 , 5 , 5 , 2 , 1 , 4 , 3 , 7 , 13 , 4 , 1 , 4 , 1 , 3 , 1 , 1 , 1 , 5 , 5 , 10 , 1 , 6 , 1 , 5 , 2 , 1 , 5 , 2 , 4 , 1 , 4 , 5 , 7 , 3 , 18 , 2 , 9 , 11 , 32 , 4 , 3 , 3 , 2 , 4 , 7 , 11 , 16 , 9 , 11 , 8 , 13 , 38 ,
3509
32 , 8 , 4 , 2 , 1 , 1 , 2 , 1 , 2 , 4 , 4 , 1 , 1 , 1 , 4 , 1 , 21 , 3 , 11 , 1 , 16 , 1 , 1 , 6 , 1 , 3 , 2 , 4 , 9 , 8 , 57 , 7 , 44 , 1 , 3 , 3 , 13 , 3 , 10 , 1 , 1 , 7 , 5 , 2 , 7 , 21 , 47 , 63 , 3 , 15 , 4 , 7 , 1 , 16 , 1 , 1 , 2 , 8 , 2 , 3 , 42 , 15 , 4 ,
3510
1 , 29 , 7 , 22 , 10 , 3 , 78 , 16 , 12 , 20 , 18 , 4 , 67 , 11 , 5 , 1 , 3 , 15 , 6 , 21 , 31 , 32 , 27 , 18 , 13 , 71 , 35 , 5 , 142 , 4 , 10 , 1 , 2 , 50 , 19 , 33 , 16 , 35 , 37 , 16 , 19 , 27 , 7 , 1 , 133 , 19 , 1 , 4 , 8 , 7 , 20 , 1 , 4 ,
3511
4 , 1 , 10 , 3 , 1 , 6 , 1 , 2 , 51 , 5 , 40 , 15 , 24 , 43 , 22928 , 11 , 1 , 13 , 154 , 70 , 3 , 1 , 1 , 7 , 4 , 10 , 1 , 2 , 1 , 1 , 2 , 1 , 2 , 1 , 2 , 2 , 1 , 1 , 2 , 1 , 1 , 1 , 1 , 1 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 1 , 1 , 1 ,
3512
3 , 2 , 1 , 1 , 1 , 1 , 2 , 1 , 1 ,
3513
} ;
3514
static ImWchar base_ranges[ ] =
3515
{
3516
0x0020 , 0x00FF ,
3517
0x3000 , 0x30FF ,
3518
0x31F0 , 0x31FF ,
3519
0xFF00 , 0xFFEF ,
3520
0xFFFD , 0xFFFD
3521
} ;
3522
static ImWchar full_ranges[ IM_ARRAYSIZE ( base_ranges ) + IM_ARRAYSIZE ( accumulative_offsets_from_0x4E00 ) * 2 + 1 ] = { 0 } ;
3523
if ( ! full_ranges[ 0 ] )
3524
{
3525
memcpy ( full_ranges, base_ranges, sizeof ( base_ranges ) ) ;
3526
UnpackAccumulativeOffsetsIntoRanges ( 0x4E00 , accumulative_offsets_from_0x4E00, IM_ARRAYSIZE ( accumulative_offsets_from_0x4E00 ) , full_ranges + IM_ARRAYSIZE ( base_ranges ) ) ;
3527
}
3528
return & full_ranges[ 0 ] ;
3529
}
3530
3531
const ImWchar* ImFontAtlas:: GetGlyphRangesCyrillic ( )
3532
{
3533
static const ImWchar ranges[ ] =
3534
{
3535
0x0020 , 0x00FF ,
3536
0x0400 , 0x052F ,
3537
0x2DE0 , 0x2DFF ,
3538
0xA640 , 0xA69F ,
3539
0 ,
3540
} ;
3541
return & ranges[ 0 ] ;
3542
}
3543
3544
const ImWchar* ImFontAtlas:: GetGlyphRangesThai ( )
3545
{
3546
static const ImWchar ranges[ ] =
3547
{
3548
0x0020 , 0x00FF ,
3549
0x2010 , 0x205E ,
3550
0x0E00 , 0x0E7F ,
3551
0 ,
3552
} ;
3553
return & ranges[ 0 ] ;
3554
}
3555
3556
const ImWchar* ImFontAtlas:: GetGlyphRangesVietnamese ( )
3557
{
3558
static const ImWchar ranges[ ] =
3559
{
3560
0x0020 , 0x00FF ,
3561
0x0102 , 0x0103 ,
3562
0x0110 , 0x0111 ,
3563
0x0128 , 0x0129 ,
3564
0x0168 , 0x0169 ,
3565
0x01A0 , 0x01A1 ,
3566
0x01AF , 0x01B0 ,
3567
0x1EA0 , 0x1EF9 ,
3568
0 ,
3569
} ;
3570
return & ranges[ 0 ] ;
3571
}
3572
3573
3574
3575
3576
3577
void ImFontGlyphRangesBuilder:: AddText ( const char * text , const char * text_end )
3578
{
3579
while ( text_end ? ( text < text_end) : * text)
3580
{
3581
unsigned int c = 0 ;
3582
int c_len = ImTextCharFromUtf8 ( & c, text, text_end) ;
3583
text += c_len;
3584
if ( c_len == 0 )
3585
break ;
3586
AddChar ( ( ImWchar) c) ;
3587
}
3588
}
3589
3590
void ImFontGlyphRangesBuilder:: AddRanges ( const ImWchar* ranges )
3591
{
3592
for ( ; ranges[ 0 ] ; ranges += 2 )
3593
for ( unsigned int c = ranges[ 0 ] ; c <= ranges[ 1 ] && c <= IM_UNICODE_CODEPOINT_MAX; c+ + )
3594
AddChar ( ( ImWchar) c) ;
3595
}
3596
3597
void ImFontGlyphRangesBuilder:: BuildRanges ( ImVector< ImWchar> * out_ranges )
3598
{
3599
const int max_codepoint = IM_UNICODE_CODEPOINT_MAX;
3600
for ( int n = 0 ; n <= max_codepoint; n+ + )
3601
if ( GetBit ( n ) )
3602
{
3603
out_ranges-> push_back ( ( ImWchar) n) ;
3604
while ( n < max_codepoint && GetBit ( n + 1 ) )
3605
n+ + ;
3606
out_ranges-> push_back ( ( ImWchar) n) ;
3607
}
3608
out_ranges-> push_back ( 0 ) ;
3609
}
3610
3611
3612
3613
3614
3615
ImFont:: ImFont ( )
3616
{
3617
FontSize = 0.0f ;
3618
FallbackAdvanceX = 0.0f ;
3619
FallbackChar = ( ImWchar) - 1 ;
3620
EllipsisChar = ( ImWchar) - 1 ;
3621
EllipsisWidth = EllipsisCharStep = 0.0f ;
3622
EllipsisCharCount = 0 ;
3623
FallbackGlyph = NULL ;
3624
ContainerAtlas = NULL ;
3625
ConfigData = NULL ;
3626
ConfigDataCount = 0 ;
3627
DirtyLookupTables = false ;
3628
Scale = 1.0f ;
3629
Ascent = Descent = 0.0f ;
3630
MetricsTotalSurface = 0 ;
3631
memset ( Used4kPagesMap, 0 , sizeof ( Used4kPagesMap ) ) ;
3632
}
3633
3634
ImFont:: ~ImFont ( )
3635
{
3636
ClearOutputData ( ) ;
3637
}
3638
3639
void ImFont:: ClearOutputData ( )
3640
{
3641
FontSize = 0.0f ;
3642
FallbackAdvanceX = 0.0f ;
3643
Glyphs. clear ( ) ;
3644
IndexAdvanceX. clear ( ) ;
3645
IndexLookup. clear ( ) ;
3646
FallbackGlyph = NULL ;
3647
ContainerAtlas = NULL ;
3648
DirtyLookupTables = true ;
3649
Ascent = Descent = 0.0f ;
3650
MetricsTotalSurface = 0 ;
3651
memset ( Used4kPagesMap, 0 , sizeof ( Used4kPagesMap ) ) ;
3652
}
3653
3654
static ImWchar FindFirstExistingGlyph ( ImFont* font , const ImWchar* candidate_chars , int candidate_chars_count )
3655
{
3656
for ( int n = 0 ; n < candidate_chars_count; n+ + )
3657
if ( font-> FindGlyphNoFallback ( candidate_chars[ n] ) != NULL )
3658
return candidate_chars[ n] ;
3659
return ( ImWchar) - 1 ;
3660
}
3661
3662
void ImFont:: BuildLookupTable ( )
3663
{
3664
int max_codepoint = 0 ;
3665
for ( int i = 0 ; i != Glyphs. Size ; i+ + )
3666
max_codepoint = ImMax ( max_codepoint, ( int ) Glyphs[ i] . Codepoint ) ;
3667
3668
3669
IM_ASSERT ( Glyphs. Size > 0 && " Font has not loaded glyph!" ) ;
3670
IM_ASSERT ( Glyphs. Size < 0xFFFF ) ;
3671
IndexAdvanceX. clear ( ) ;
3672
IndexLookup. clear ( ) ;
3673
DirtyLookupTables = false ;
3674
memset ( Used4kPagesMap, 0 , sizeof ( Used4kPagesMap ) ) ;
3675
GrowIndex ( max_codepoint + 1 ) ;
3676
for ( int i = 0 ; i < Glyphs. Size ; i+ + )
3677
{
3678
int codepoint = ( int ) Glyphs[ i] . Codepoint ;
3679
IndexAdvanceX[ codepoint] = Glyphs[ i] . AdvanceX ;
3680
IndexLookup[ codepoint] = ( ImWchar) i;
3681
3682
3683
const int page_n = codepoint / 4096 ;
3684
Used4kPagesMap[ page_n >> 3 ] |= 1 << ( page_n & 7 ) ;
3685
}
3686
3687
3688
3689
if ( FindGlyph ( ( ImWchar) ' ' ) )
3690
{
3691
if ( Glyphs. back ( ) . Codepoint != ' \t ' )
3692
Glyphs. resize ( Glyphs. Size + 1 ) ;
3693
ImFontGlyph& tab_glyph = Glyphs. back ( ) ;
3694
tab_glyph = * FindGlyph ( ( ImWchar) ' ' ) ;
3695
tab_glyph. Codepoint = ' \t ' ;
3696
tab_glyph. AdvanceX *= IM_TABSIZE;
3697
IndexAdvanceX[ ( int ) tab_glyph. Codepoint ] = ( float ) tab_glyph. AdvanceX ;
3698
IndexLookup[ ( int ) tab_glyph. Codepoint ] = ( ImWchar) ( Glyphs. Size - 1 ) ;
3699
}
3700
3701
3702
SetGlyphVisible ( ( ImWchar) ' ' , false ) ;
3703
SetGlyphVisible ( ( ImWchar) ' \t ' , false ) ;
3704
3705
3706
const ImWchar fallback_chars[ ] = { ( ImWchar) IM_UNICODE_CODEPOINT_INVALID, ( ImWchar) ' ?' , ( ImWchar) ' ' } ;
3707
FallbackGlyph = FindGlyphNoFallback ( FallbackChar ) ;
3708
if ( FallbackGlyph == NULL )
3709
{
3710
FallbackChar = FindFirstExistingGlyph ( this , fallback_chars, IM_ARRAYSIZE ( fallback_chars ) ) ;
3711
FallbackGlyph = FindGlyphNoFallback ( FallbackChar ) ;
3712
if ( FallbackGlyph == NULL )
3713
{
3714
FallbackGlyph = & Glyphs. back ( ) ;
3715
FallbackChar = ( ImWchar) FallbackGlyph-> Codepoint ;
3716
}
3717
}
3718
FallbackAdvanceX = FallbackGlyph-> AdvanceX ;
3719
for ( int i = 0 ; i < max_codepoint + 1 ; i+ + )
3720
if ( IndexAdvanceX[ i] < 0.0f )
3721
IndexAdvanceX[ i] = FallbackAdvanceX;
3722
3723
3724
3725
3726
const ImWchar ellipsis_chars[ ] = { ( ImWchar) 0x2026 , ( ImWchar) 0x0085 } ;
3727
const ImWchar dots_chars[ ] = { ( ImWchar) ' .' , ( ImWchar) 0xFF0E } ;
3728
if ( EllipsisChar == ( ImWchar) - 1 )
3729
EllipsisChar = FindFirstExistingGlyph ( this , ellipsis_chars, IM_ARRAYSIZE ( ellipsis_chars ) ) ;
3730
const ImWchar dot_char = FindFirstExistingGlyph ( this , dots_chars, IM_ARRAYSIZE ( dots_chars ) ) ;
3731
if ( EllipsisChar != ( ImWchar) - 1 )
3732
{
3733
EllipsisCharCount = 1 ;
3734
EllipsisWidth = EllipsisCharStep = FindGlyph ( EllipsisChar ) -> X1 ;
3735
}
3736
else if ( dot_char != ( ImWchar) - 1 )
3737
{
3738
const ImFontGlyph* glyph = FindGlyph ( dot_char ) ;
3739
EllipsisChar = dot_char;
3740
EllipsisCharCount = 3 ;
3741
EllipsisCharStep = ( glyph-> X1 - glyph-> X0 ) + 1.0f ;
3742
EllipsisWidth = EllipsisCharStep * 3.0f - 1.0f ;
3743
}
3744
}
3745
3746
3747
3748
bool ImFont:: IsGlyphRangeUnused ( unsigned int c_begin , unsigned int c_last )
3749
{
3750
unsigned int page_begin = ( c_begin / 4096 ) ;
3751
unsigned int page_last = ( c_last / 4096 ) ;
3752
for ( unsigned int page_n = page_begin; page_n <= page_last; page_n+ + )
3753
if ( ( page_n >> 3 ) < sizeof ( Used4kPagesMap ) )
3754
if ( Used4kPagesMap[ page_n >> 3 ] & ( 1 << ( page_n & 7 ) ) )
3755
return false ;
3756
return true ;
3757
}
3758
3759
void ImFont:: SetGlyphVisible ( ImWchar c , bool visible )
3760
{
3761
if ( ImFontGlyph* glyph = ( ImFontGlyph* ) ( void * ) FindGlyph ( ( ImWchar) c) )
3762
glyph-> Visible = visible ? 1 : 0 ;
3763
}
3764
3765
void ImFont:: GrowIndex ( int new_size )
3766
{
3767
IM_ASSERT ( IndexAdvanceX. Size == IndexLookup. Size ) ;
3768
if ( new_size <= IndexLookup. Size )
3769
return ;
3770
IndexAdvanceX. resize ( new_size, - 1.0f ) ;
3771
IndexLookup. resize ( new_size, ( ImWchar) - 1 ) ;
3772
}
3773
3774
3775
3776
3777
void ImFont:: AddGlyph ( const ImFontConfig* cfg , ImWchar codepoint , float x0 , float y0 , float x1 , float y1 , float u0 , float v0 , float u1 , float v1 , float advance_x )
3778
{
3779
if ( cfg != NULL )
3780
{
3781
3782
const float advance_x_original = advance_x;
3783
advance_x = ImClamp ( advance_x, cfg-> GlyphMinAdvanceX , cfg-> GlyphMaxAdvanceX ) ;
3784
if ( advance_x != advance_x_original)
3785
{
3786
float char_off_x = cfg-> PixelSnapH ? ImTrunc ( ( advance_x - advance_x_original) * 0.5f ) : ( advance_x - advance_x_original) * 0.5f ;
3787
x0 += char_off_x;
3788
x1 += char_off_x;
3789
}
3790
3791
3792
if ( cfg-> PixelSnapH )
3793
advance_x = IM_ROUND ( advance_x ) ;
3794
3795
3796
advance_x += cfg-> GlyphExtraSpacing . x ;
3797
}
3798
3799
Glyphs. resize ( Glyphs. Size + 1 ) ;
3800
ImFontGlyph& glyph = Glyphs. back ( ) ;
3801
glyph. Codepoint = ( unsigned int ) codepoint;
3802
glyph. Visible = ( x0 != x1) && ( y0 != y1) ;
3803
glyph. Colored = false ;
3804
glyph. X0 = x0;
3805
glyph. Y0 = y0;
3806
glyph. X1 = x1;
3807
glyph. Y1 = y1;
3808
glyph. U0 = u0;
3809
glyph. V0 = v0;
3810
glyph. U1 = u1;
3811
glyph. V1 = v1;
3812
glyph. AdvanceX = advance_x;
3813
3814
3815
3816
float pad = ContainerAtlas-> TexGlyphPadding + 0.99f ;
3817
DirtyLookupTables = true ;
3818
MetricsTotalSurface += ( int ) ( ( glyph. U1 - glyph. U0 ) * ContainerAtlas-> TexWidth + pad) * ( int ) ( ( glyph. V1 - glyph. V0 ) * ContainerAtlas-> TexHeight + pad) ;
3819
}
3820
3821
void ImFont:: AddRemapChar ( ImWchar dst , ImWchar src , bool overwrite_dst )
3822
{
3823
IM_ASSERT ( IndexLookup. Size > 0 ) ;
3824
unsigned int index_size = ( unsigned int ) IndexLookup. Size ;
3825
3826
if ( dst < index_size && IndexLookup. Data [ dst] == ( ImWchar) - 1 && ! overwrite_dst)
3827
return ;
3828
if ( src >= index_size && dst >= index_size)
3829
return ;
3830
3831
GrowIndex ( dst + 1 ) ;
3832
IndexLookup[ dst] = ( src < index_size) ? IndexLookup. Data [ src] : ( ImWchar) - 1 ;
3833
IndexAdvanceX[ dst] = ( src < index_size) ? IndexAdvanceX. Data [ src] : 1.0f ;
3834
}
3835
3836
const ImFontGlyph* ImFont:: FindGlyph ( ImWchar c )
3837
{
3838
if ( c >= ( size_t ) IndexLookup. Size )
3839
return FallbackGlyph;
3840
const ImWchar i = IndexLookup. Data [ c] ;
3841
if ( i == ( ImWchar) - 1 )
3842
return FallbackGlyph;
3843
return & Glyphs. Data [ i] ;
3844
}
3845
3846
const ImFontGlyph* ImFont:: FindGlyphNoFallback ( ImWchar c )
3847
{
3848
if ( c >= ( size_t ) IndexLookup. Size )
3849
return NULL ;
3850
const ImWchar i = IndexLookup. Data [ c] ;
3851
if ( i == ( ImWchar) - 1 )
3852
return NULL ;
3853
return & Glyphs. Data [ i] ;
3854
}
3855
3856
3857
static inline const char * CalcWordWrapNextLineStartA ( const char * text , const char * text_end )
3858
{
3859
while ( text < text_end && ImCharIsBlankA ( * text) )
3860
text+ + ;
3861
if ( * text == ' \n ' )
3862
text+ + ;
3863
return text;
3864
}
3865
3866
#define ImFontGetCharAdvanceX ( _FONT , _CH ) ( ( int ) ( _CH) < ( _FONT) -> IndexAdvanceX . Size ? ( _FONT) -> IndexAdvanceX . Data [ _CH] : ( _FONT) -> FallbackAdvanceX )
3867
3868
3869
3870
3871
const char * ImFont:: CalcWordWrapPositionA ( float scale , const char * text , const char * text_end , float wrap_width )
3872
{
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
float line_width = 0.0f ;
3885
float word_width = 0.0f ;
3886
float blank_width = 0.0f ;
3887
wrap_width /= scale;
3888
3889
const char * word_end = text;
3890
const char * prev_word_end = NULL ;
3891
bool inside_word = true ;
3892
3893
const char * s = text;
3894
IM_ASSERT ( text_end != NULL ) ;
3895
while ( s < text_end)
3896
{
3897
unsigned int c = ( unsigned int ) * s;
3898
const char * next_s;
3899
if ( c < 0x80 )
3900
next_s = s + 1 ;
3901
else
3902
next_s = s + ImTextCharFromUtf8 ( & c, s, text_end) ;
3903
3904
if ( c < 32 )
3905
{
3906
if ( c == ' \n ' )
3907
{
3908
line_width = word_width = blank_width = 0.0f ;
3909
inside_word = true ;
3910
s = next_s;
3911
continue ;
3912
}
3913
if ( c == ' \r ' )
3914
{
3915
s = next_s;
3916
continue ;
3917
}
3918
}
3919
3920
const float char_width = ImFontGetCharAdvanceX ( this , c) ;
3921
if ( ImCharIsBlankW ( c ) )
3922
{
3923
if ( inside_word)
3924
{
3925
line_width += blank_width;
3926
blank_width = 0.0f ;
3927
word_end = s;
3928
}
3929
blank_width += char_width;
3930
inside_word = false ;
3931
}
3932
else
3933
{
3934
word_width += char_width;
3935
if ( inside_word)
3936
{
3937
word_end = next_s;
3938
}
3939
else
3940
{
3941
prev_word_end = word_end;
3942
line_width += word_width + blank_width;
3943
word_width = blank_width = 0.0f ;
3944
}
3945
3946
3947
inside_word = ( c != ' .' && c != ' ,' && c != ' ;' && c != ' !' && c != ' ?' && c != ' \" ' ) ;
3948
}
3949
3950
3951
if ( line_width + word_width > wrap_width)
3952
{
3953
3954
if ( word_width < wrap_width)
3955
s = prev_word_end ? prev_word_end : word_end;
3956
break ;
3957
}
3958
3959
s = next_s;
3960
}
3961
3962
3963
3964
if ( s == text && text < text_end)
3965
return s + 1 ;
3966
return s;
3967
}
3968
3969
ImVec2 ImFont:: CalcTextSizeA ( float size , float max_width , float wrap_width , const char * text_begin , const char * text_end , const char * * remaining )
3970
{
3971
if ( ! text_end)
3972
text_end = text_begin + strlen ( text_begin ) ;
3973
3974
const float line_height = size;
3975
const float scale = size / FontSize;
3976
3977
ImVec2 text_size = ImVec2 ( 0 , 0 ) ;
3978
float line_width = 0.0f ;
3979
3980
const bool word_wrap_enabled = ( wrap_width > 0.0f ) ;
3981
const char * word_wrap_eol = NULL ;
3982
3983
const char * s = text_begin;
3984
while ( s < text_end)
3985
{
3986
if ( word_wrap_enabled)
3987
{
3988
3989
if ( ! word_wrap_eol)
3990
word_wrap_eol = CalcWordWrapPositionA ( scale, s, text_end, wrap_width - line_width ) ;
3991
3992
if ( s >= word_wrap_eol)
3993
{
3994
if ( text_size. x < line_width)
3995
text_size. x = line_width;
3996
text_size. y += line_height;
3997
line_width = 0.0f ;
3998
word_wrap_eol = NULL ;
3999
s = CalcWordWrapNextLineStartA ( s, text_end ) ;
4000
continue ;
4001
}
4002
}
4003
4004
4005
const char * prev_s = s;
4006
unsigned int c = ( unsigned int ) * s;
4007
if ( c < 0x80 )
4008
s += 1 ;
4009
else
4010
s += ImTextCharFromUtf8 ( & c, s, text_end) ;
4011
4012
if ( c < 32 )
4013
{
4014
if ( c == ' \n ' )
4015
{
4016
text_size. x = ImMax ( text_size. x , line_width ) ;
4017
text_size. y += line_height;
4018
line_width = 0.0f ;
4019
continue ;
4020
}
4021
if ( c == ' \r ' )
4022
continue ;
4023
}
4024
4025
const float char_width = ImFontGetCharAdvanceX ( this , c) * scale;
4026
if ( line_width + char_width >= max_width)
4027
{
4028
s = prev_s;
4029
break ;
4030
}
4031
4032
line_width += char_width;
4033
}
4034
4035
if ( text_size. x < line_width)
4036
text_size. x = line_width;
4037
4038
if ( line_width > 0 || text_size. y == 0.0f )
4039
text_size. y += line_height;
4040
4041
if ( remaining)
4042
* remaining = s;
4043
4044
return text_size;
4045
}
4046
4047
4048
void ImFont:: RenderChar ( ImDrawList* draw_list , float size , const ImVec2& pos , ImU32 col , ImWchar c )
4049
{
4050
const ImFontGlyph* glyph = FindGlyph ( c ) ;
4051
if ( ! glyph || ! glyph-> Visible )
4052
return ;
4053
if ( glyph-> Colored )
4054
col |= ~ IM_COL32_A_MASK;
4055
float scale = ( size >= 0.0f ) ? ( size / FontSize) : 1.0f ;
4056
float x = IM_TRUNC ( pos. x ) ;
4057
float y = IM_TRUNC ( pos. y ) ;
4058
draw_list-> PrimReserve ( 6 , 4 ) ;
4059
draw_list-> PrimRectUV ( ImVec2 ( x + glyph-> X0 * scale, y + glyph-> Y0 * scale ) , ImVec2 ( x + glyph-> X1 * scale, y + glyph-> Y1 * scale ) , ImVec2 ( glyph-> U0 , glyph-> V0 ) , ImVec2 ( glyph-> U1 , glyph-> V1 ) , col) ;
4060
}
4061
4062
4063
void ImFont:: RenderText ( ImDrawList* draw_list , float size , const ImVec2& pos , ImU32 col , const ImVec4& clip_rect , const char * text_begin , const char * text_end , float wrap_width , bool cpu_fine_clip )
4064
{
4065
if ( ! text_end)
4066
text_end = text_begin + strlen ( text_begin ) ;
4067
4068
4069
float x = IM_TRUNC ( pos. x ) ;
4070
float y = IM_TRUNC ( pos. y ) ;
4071
if ( y > clip_rect. w )
4072
return ;
4073
4074
const float scale = size / FontSize;
4075
const float line_height = FontSize * scale;
4076
const float origin_x = x;
4077
const bool word_wrap_enabled = ( wrap_width > 0.0f ) ;
4078
4079
4080
const char * s = text_begin;
4081
if ( y + line_height < clip_rect. y )
4082
while ( y + line_height < clip_rect. y && s < text_end)
4083
{
4084
const char * line_end = ( const char * ) memchr ( s, ' \n ' , text_end - s ) ;
4085
if ( word_wrap_enabled)
4086
{
4087
4088
4089
4090
s = CalcWordWrapPositionA ( scale, s, line_end ? line_end : text_end, wrap_width ) ;
4091
s = CalcWordWrapNextLineStartA ( s, text_end ) ;
4092
}
4093
else
4094
{
4095
s = line_end ? line_end + 1 : text_end;
4096
}
4097
y += line_height;
4098
}
4099
4100
4101
4102
if ( text_end - s > 10000 && ! word_wrap_enabled)
4103
{
4104
const char * s_end = s;
4105
float y_end = y;
4106
while ( y_end < clip_rect. w && s_end < text_end)
4107
{
4108
s_end = ( const char * ) memchr ( s_end, ' \n ' , text_end - s_end ) ;
4109
s_end = s_end ? s_end + 1 : text_end;
4110
y_end += line_height;
4111
}
4112
text_end = s_end;
4113
}
4114
if ( s == text_end)
4115
return ;
4116
4117
4118
const int vtx_count_max = ( int ) ( text_end - s) * 4 ;
4119
const int idx_count_max = ( int ) ( text_end - s) * 6 ;
4120
const int idx_expected_size = draw_list-> IdxBuffer . Size + idx_count_max;
4121
draw_list-> PrimReserve ( idx_count_max, vtx_count_max ) ;
4122
ImDrawVert* vtx_write = draw_list-> _VtxWritePtr ;
4123
ImDrawIdx* idx_write = draw_list-> _IdxWritePtr ;
4124
unsigned int vtx_index = draw_list-> _VtxCurrentIdx ;
4125
4126
const ImU32 col_untinted = col | ~ IM_COL32_A_MASK;
4127
const char * word_wrap_eol = NULL ;
4128
4129
while ( s < text_end)
4130
{
4131
if ( word_wrap_enabled)
4132
{
4133
4134
if ( ! word_wrap_eol)
4135
word_wrap_eol = CalcWordWrapPositionA ( scale, s, text_end, wrap_width - ( x - origin_x) ) ;
4136
4137
if ( s >= word_wrap_eol)
4138
{
4139
x = origin_x;
4140
y += line_height;
4141
if ( y > clip_rect. w )
4142
break ;
4143
word_wrap_eol = NULL ;
4144
s = CalcWordWrapNextLineStartA ( s, text_end ) ;
4145
continue ;
4146
}
4147
}
4148
4149
4150
unsigned int c = ( unsigned int ) * s;
4151
if ( c < 0x80 )
4152
s += 1 ;
4153
else
4154
s += ImTextCharFromUtf8 ( & c, s, text_end) ;
4155
4156
if ( c < 32 )
4157
{
4158
if ( c == ' \n ' )
4159
{
4160
x = origin_x;
4161
y += line_height;
4162
if ( y > clip_rect. w )
4163
break ;
4164
continue ;
4165
}
4166
if ( c == ' \r ' )
4167
continue ;
4168
}
4169
4170
const ImFontGlyph* glyph = FindGlyph ( ( ImWchar) c) ;
4171
if ( glyph == NULL )
4172
continue ;
4173
4174
float char_width = glyph-> AdvanceX * scale;
4175
if ( glyph-> Visible )
4176
{
4177
4178
float x1 = x + glyph-> X0 * scale;
4179
float x2 = x + glyph-> X1 * scale;
4180
float y1 = y + glyph-> Y0 * scale;
4181
float y2 = y + glyph-> Y1 * scale;
4182
if ( x1 <= clip_rect. z && x2 >= clip_rect. x )
4183
{
4184
4185
float u1 = glyph-> U0 ;
4186
float v1 = glyph-> V0 ;
4187
float u2 = glyph-> U1 ;
4188
float v2 = glyph-> V1 ;
4189
4190
4191
if ( cpu_fine_clip)
4192
{
4193
if ( x1 < clip_rect. x )
4194
{
4195
u1 = u1 + ( 1.0f - ( x2 - clip_rect. x ) / ( x2 - x1) ) * ( u2 - u1) ;
4196
x1 = clip_rect. x ;
4197
}
4198
if ( y1 < clip_rect. y )
4199
{
4200
v1 = v1 + ( 1.0f - ( y2 - clip_rect. y ) / ( y2 - y1) ) * ( v2 - v1) ;
4201
y1 = clip_rect. y ;
4202
}
4203
if ( x2 > clip_rect. z )
4204
{
4205
u2 = u1 + ( ( clip_rect. z - x1) / ( x2 - x1) ) * ( u2 - u1) ;
4206
x2 = clip_rect. z ;
4207
}
4208
if ( y2 > clip_rect. w )
4209
{
4210
v2 = v1 + ( ( clip_rect. w - y1) / ( y2 - y1) ) * ( v2 - v1) ;
4211
y2 = clip_rect. w ;
4212
}
4213
if ( y1 >= y2)
4214
{
4215
x += char_width;
4216
continue ;
4217
}
4218
}
4219
4220
4221
ImU32 glyph_col = glyph-> Colored ? col_untinted : col;
4222
4223
4224
{
4225
vtx_write[ 0 ] . pos . x = x1; vtx_write[ 0 ] . pos . y = y1; vtx_write[ 0 ] . col = glyph_col; vtx_write[ 0 ] . uv . x = u1; vtx_write[ 0 ] . uv . y = v1;
4226
vtx_write[ 1 ] . pos . x = x2; vtx_write[ 1 ] . pos . y = y1; vtx_write[ 1 ] . col = glyph_col; vtx_write[ 1 ] . uv . x = u2; vtx_write[ 1 ] . uv . y = v1;
4227
vtx_write[ 2 ] . pos . x = x2; vtx_write[ 2 ] . pos . y = y2; vtx_write[ 2 ] . col = glyph_col; vtx_write[ 2 ] . uv . x = u2; vtx_write[ 2 ] . uv . y = v2;
4228
vtx_write[ 3 ] . pos . x = x1; vtx_write[ 3 ] . pos . y = y2; vtx_write[ 3 ] . col = glyph_col; vtx_write[ 3 ] . uv . x = u1; vtx_write[ 3 ] . uv . y = v2;
4229
idx_write[ 0 ] = ( ImDrawIdx) ( vtx_index) ; idx_write[ 1 ] = ( ImDrawIdx) ( vtx_index + 1 ) ; idx_write[ 2 ] = ( ImDrawIdx) ( vtx_index + 2 ) ;
4230
idx_write[ 3 ] = ( ImDrawIdx) ( vtx_index) ; idx_write[ 4 ] = ( ImDrawIdx) ( vtx_index + 2 ) ; idx_write[ 5 ] = ( ImDrawIdx) ( vtx_index + 3 ) ;
4231
vtx_write += 4 ;
4232
vtx_index += 4 ;
4233
idx_write += 6 ;
4234
}
4235
}
4236
}
4237
x += char_width;
4238
}
4239
4240
4241
draw_list-> VtxBuffer . Size = ( int ) ( vtx_write - draw_list-> VtxBuffer . Data ) ;
4242
draw_list-> IdxBuffer . Size = ( int ) ( idx_write - draw_list-> IdxBuffer . Data ) ;
4243
draw_list-> CmdBuffer [ draw_list-> CmdBuffer . Size - 1 ] . ElemCount -= ( idx_expected_size - draw_list-> IdxBuffer . Size ) ;
4244
draw_list-> _VtxWritePtr = vtx_write;
4245
draw_list-> _IdxWritePtr = idx_write;
4246
draw_list-> _VtxCurrentIdx = vtx_index;
4247
}
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
void ImGui:: RenderArrow ( ImDrawList* draw_list , ImVec2 pos , ImU32 col , ImGuiDir dir , float scale )
4267
{
4268
const float h = draw_list-> _Data -> FontSize * 1.00f ;
4269
float r = h * 0.40f * scale;
4270
ImVec2 center = pos + ImVec2 ( h * 0.50f , h * 0.50f * scale ) ;
4271
4272
ImVec2 a, b, c;
4273
switch ( dir)
4274
{
4275
case ImGuiDir_Up:
4276
case ImGuiDir_Down:
4277
if ( dir == ImGuiDir_Up) r = - r;
4278
a = ImVec2 ( + 0.000f , + 0.750f ) * r;
4279
b = ImVec2 ( - 0.866f , - 0.750f ) * r;
4280
c = ImVec2 ( + 0.866f , - 0.750f ) * r;
4281
break ;
4282
case ImGuiDir_Left:
4283
case ImGuiDir_Right:
4284
if ( dir == ImGuiDir_Left) r = - r;
4285
a = ImVec2 ( + 0.750f , + 0.000f ) * r;
4286
b = ImVec2 ( - 0.750f , + 0.866f ) * r;
4287
c = ImVec2 ( - 0.750f , - 0.866f ) * r;
4288
break ;
4289
case ImGuiDir_None:
4290
case ImGuiDir_COUNT:
4291
IM_ASSERT ( 0 ) ;
4292
break ;
4293
}
4294
draw_list-> AddTriangleFilled ( center + a, center + b, center + c, col ) ;
4295
}
4296
4297
void ImGui:: RenderBullet ( ImDrawList* draw_list , ImVec2 pos , ImU32 col )
4298
{
4299
4300
draw_list-> AddCircleFilled ( pos, draw_list-> _Data -> FontSize * 0.20f , col, 8 ) ;
4301
}
4302
4303
void ImGui:: RenderCheckMark ( ImDrawList* draw_list , ImVec2 pos , ImU32 col , float sz )
4304
{
4305
float thickness = ImMax ( sz / 5.0f , 1.0f ) ;
4306
sz -= thickness * 0.5f ;
4307
pos += ImVec2 ( thickness * 0.25f , thickness * 0.25f ) ;
4308
4309
float third = sz / 3.0f ;
4310
float bx = pos. x + third;
4311
float by = pos. y + sz - third * 0.5f ;
4312
draw_list-> PathLineTo ( ImVec2 ( bx - third, by - third ) ) ;
4313
draw_list-> PathLineTo ( ImVec2 ( bx, by ) ) ;
4314
draw_list-> PathLineTo ( ImVec2 ( bx + third * 2.0f , by - third * 2.0f ) ) ;
4315
draw_list-> PathStroke ( col, 0 , thickness ) ;
4316
}
4317
4318
4319
void ImGui:: RenderArrowPointingAt ( ImDrawList* draw_list , ImVec2 pos , ImVec2 half_sz , ImGuiDir direction , ImU32 col )
4320
{
4321
switch ( direction)
4322
{
4323
case ImGuiDir_Left: draw_list-> AddTriangleFilled ( ImVec2 ( pos. x + half_sz. x , pos. y - half_sz. y ) , ImVec2 ( pos. x + half_sz. x , pos. y + half_sz. y ) , pos, col) ; return ;
4324
case ImGuiDir_Right: draw_list-> AddTriangleFilled ( ImVec2 ( pos. x - half_sz. x , pos. y + half_sz. y ) , ImVec2 ( pos. x - half_sz. x , pos. y - half_sz. y ) , pos, col) ; return ;
4325
case ImGuiDir_Up: draw_list-> AddTriangleFilled ( ImVec2 ( pos. x + half_sz. x , pos. y + half_sz. y ) , ImVec2 ( pos. x - half_sz. x , pos. y + half_sz. y ) , pos, col) ; return ;
4326
case ImGuiDir_Down: draw_list-> AddTriangleFilled ( ImVec2 ( pos. x - half_sz. x , pos. y - half_sz. y ) , ImVec2 ( pos. x + half_sz. x , pos. y - half_sz. y ) , pos, col) ; return ;
4327
case ImGuiDir_None: case ImGuiDir_COUNT: break ;
4328
}
4329
}
4330
4331
4332
4333
void ImGui:: RenderArrowDockMenu ( ImDrawList* draw_list , ImVec2 p_min , float sz , ImU32 col )
4334
{
4335
draw_list-> AddRectFilled ( p_min + ImVec2 ( sz * 0.20f , sz * 0.15f ) , p_min + ImVec2 ( sz * 0.80f , sz * 0.30f ) , col ) ;
4336
RenderArrowPointingAt ( draw_list, p_min + ImVec2 ( sz * 0.50f , sz * 0.85f ) , ImVec2 ( sz * 0.30f , sz * 0.40f ) , ImGuiDir_Down, col ) ;
4337
}
4338
4339
static inline float ImAcos01 ( float x )
4340
{
4341
if ( x <= 0.0f ) return IM_PI * 0.5f ;
4342
if ( x >= 1.0f ) return 0.0f ;
4343
return ImAcos ( x ) ;
4344
4345
}
4346
4347
4348
void ImGui:: RenderRectFilledRangeH ( ImDrawList* draw_list , const ImRect& rect , ImU32 col , float x_start_norm , float x_end_norm , float rounding )
4349
{
4350
if ( x_end_norm == x_start_norm)
4351
return ;
4352
if ( x_start_norm > x_end_norm)
4353
ImSwap ( x_start_norm, x_end_norm ) ;
4354
4355
ImVec2 p0 = ImVec2 ( ImLerp ( rect. Min . x , rect. Max . x , x_start_norm ) , rect. Min . y ) ;
4356
ImVec2 p1 = ImVec2 ( ImLerp ( rect. Min . x , rect. Max . x , x_end_norm ) , rect. Max . y ) ;
4357
if ( rounding == 0.0f )
4358
{
4359
draw_list-> AddRectFilled ( p0, p1, col, 0.0f ) ;
4360
return ;
4361
}
4362
4363
rounding = ImClamp ( ImMin ( ( rect. Max . x - rect. Min . x ) * 0.5f , ( rect. Max . y - rect. Min . y ) * 0.5f ) - 1.0f , 0.0f , rounding) ;
4364
const float inv_rounding = 1.0f / rounding;
4365
const float arc0_b = ImAcos01 ( 1.0f - ( p0. x - rect. Min . x ) * inv_rounding) ;
4366
const float arc0_e = ImAcos01 ( 1.0f - ( p1. x - rect. Min . x ) * inv_rounding) ;
4367
const float half_pi = IM_PI * 0.5f ;
4368
const float x0 = ImMax ( p0. x , rect. Min . x + rounding ) ;
4369
if ( arc0_b == arc0_e)
4370
{
4371
draw_list-> PathLineTo ( ImVec2 ( x0, p1. y ) ) ;
4372
draw_list-> PathLineTo ( ImVec2 ( x0, p0. y ) ) ;
4373
}
4374
else if ( arc0_b == 0.0f && arc0_e == half_pi)
4375
{
4376
draw_list-> PathArcToFast ( ImVec2 ( x0, p1. y - rounding ) , rounding, 3 , 6 ) ;
4377
draw_list-> PathArcToFast ( ImVec2 ( x0, p0. y + rounding ) , rounding, 6 , 9 ) ;
4378
}
4379
else
4380
{
4381
draw_list-> PathArcTo ( ImVec2 ( x0, p1. y - rounding ) , rounding, IM_PI - arc0_e, IM_PI - arc0_b) ;
4382
draw_list-> PathArcTo ( ImVec2 ( x0, p0. y + rounding ) , rounding, IM_PI + arc0_b, IM_PI + arc0_e) ;
4383
}
4384
if ( p1. x > rect. Min . x + rounding)
4385
{
4386
const float arc1_b = ImAcos01 ( 1.0f - ( rect. Max . x - p1. x ) * inv_rounding) ;
4387
const float arc1_e = ImAcos01 ( 1.0f - ( rect. Max . x - p0. x ) * inv_rounding) ;
4388
const float x1 = ImMin ( p1. x , rect. Max . x - rounding ) ;
4389
if ( arc1_b == arc1_e)
4390
{
4391
draw_list-> PathLineTo ( ImVec2 ( x1, p0. y ) ) ;
4392
draw_list-> PathLineTo ( ImVec2 ( x1, p1. y ) ) ;
4393
}
4394
else if ( arc1_b == 0.0f && arc1_e == half_pi)
4395
{
4396
draw_list-> PathArcToFast ( ImVec2 ( x1, p0. y + rounding ) , rounding, 9 , 12 ) ;
4397
draw_list-> PathArcToFast ( ImVec2 ( x1, p1. y - rounding ) , rounding, 0 , 3 ) ;
4398
}
4399
else
4400
{
4401
draw_list-> PathArcTo ( ImVec2 ( x1, p0. y + rounding ) , rounding, - arc1_e, - arc1_b) ;
4402
draw_list-> PathArcTo ( ImVec2 ( x1, p1. y - rounding ) , rounding, + arc1_b, + arc1_e) ;
4403
}
4404
}
4405
draw_list-> PathFillConvex ( col ) ;
4406
}
4407
4408
void ImGui:: RenderRectFilledWithHole ( ImDrawList* draw_list , const ImRect& outer , const ImRect& inner , ImU32 col , float rounding )
4409
{
4410
const bool fill_L = ( inner. Min . x > outer. Min . x ) ;
4411
const bool fill_R = ( inner. Max . x < outer. Max . x ) ;
4412
const bool fill_U = ( inner. Min . y > outer. Min . y ) ;
4413
const bool fill_D = ( inner. Max . y < outer. Max . y ) ;
4414
if ( fill_L) draw_list-> AddRectFilled ( ImVec2 ( outer. Min . x , inner. Min . y ) , ImVec2 ( inner. Min . x , inner. Max . y ) , col, rounding, ImDrawFlags_RoundCornersNone | ( fill_U ? 0 : ImDrawFlags_RoundCornersTopLeft) | ( fill_D ? 0 : ImDrawFlags_RoundCornersBottomLeft) ) ;
4415
if ( fill_R) draw_list-> AddRectFilled ( ImVec2 ( inner. Max . x , inner. Min . y ) , ImVec2 ( outer. Max . x , inner. Max . y ) , col, rounding, ImDrawFlags_RoundCornersNone | ( fill_U ? 0 : ImDrawFlags_RoundCornersTopRight) | ( fill_D ? 0 : ImDrawFlags_RoundCornersBottomRight) ) ;
4416
if ( fill_U) draw_list-> AddRectFilled ( ImVec2 ( inner. Min . x , outer. Min . y ) , ImVec2 ( inner. Max . x , inner. Min . y ) , col, rounding, ImDrawFlags_RoundCornersNone | ( fill_L ? 0 : ImDrawFlags_RoundCornersTopLeft) | ( fill_R ? 0 : ImDrawFlags_RoundCornersTopRight) ) ;
4417
if ( fill_D) draw_list-> AddRectFilled ( ImVec2 ( inner. Min . x , inner. Max . y ) , ImVec2 ( inner. Max . x , outer. Max . y ) , col, rounding, ImDrawFlags_RoundCornersNone | ( fill_L ? 0 : ImDrawFlags_RoundCornersBottomLeft) | ( fill_R ? 0 : ImDrawFlags_RoundCornersBottomRight) ) ;
4418
if ( fill_L && fill_U) draw_list-> AddRectFilled ( ImVec2 ( outer. Min . x , outer. Min . y ) , ImVec2 ( inner. Min . x , inner. Min . y ) , col, rounding, ImDrawFlags_RoundCornersTopLeft) ;
4419
if ( fill_R && fill_U) draw_list-> AddRectFilled ( ImVec2 ( inner. Max . x , outer. Min . y ) , ImVec2 ( outer. Max . x , inner. Min . y ) , col, rounding, ImDrawFlags_RoundCornersTopRight) ;
4420
if ( fill_L && fill_D) draw_list-> AddRectFilled ( ImVec2 ( outer. Min . x , inner. Max . y ) , ImVec2 ( inner. Min . x , outer. Max . y ) , col, rounding, ImDrawFlags_RoundCornersBottomLeft) ;
4421
if ( fill_R && fill_D) draw_list-> AddRectFilled ( ImVec2 ( inner. Max . x , inner. Max . y ) , ImVec2 ( outer. Max . x , outer. Max . y ) , col, rounding, ImDrawFlags_RoundCornersBottomRight) ;
4422
}
4423
4424
ImDrawFlags ImGui:: CalcRoundingFlagsForRectInRect ( const ImRect& r_in , const ImRect& r_outer , float threshold )
4425
{
4426
bool round_l = r_in. Min . x <= r_outer. Min . x + threshold;
4427
bool round_r = r_in. Max . x >= r_outer. Max . x - threshold;
4428
bool round_t = r_in. Min . y <= r_outer. Min . y + threshold;
4429
bool round_b = r_in. Max . y >= r_outer. Max . y - threshold;
4430
return ImDrawFlags_RoundCornersNone
4431
| ( ( round_t && round_l) ? ImDrawFlags_RoundCornersTopLeft : 0 ) | ( ( round_t && round_r) ? ImDrawFlags_RoundCornersTopRight : 0 )
4432
| ( ( round_b && round_l) ? ImDrawFlags_RoundCornersBottomLeft : 0 ) | ( ( round_b && round_r) ? ImDrawFlags_RoundCornersBottomRight : 0 ) ;
4433
}
4434
4435
4436
4437
4438
4439
void ImGui:: RenderColorRectWithAlphaCheckerboard ( ImDrawList* draw_list , ImVec2 p_min , ImVec2 p_max , ImU32 col , float grid_step , ImVec2 grid_off , float rounding , ImDrawFlags flags )
4440
{
4441
if ( ( flags & ImDrawFlags_RoundCornersMask_) == 0 )
4442
flags = ImDrawFlags_RoundCornersDefault_;
4443
if ( ( ( col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT) < 0xFF )
4444
{
4445
ImU32 col_bg1 = GetColorU32 ( ImAlphaBlendColors ( IM_COL32 ( 204 , 204 , 204 , 255 ) , col) ) ;
4446
ImU32 col_bg2 = GetColorU32 ( ImAlphaBlendColors ( IM_COL32 ( 128 , 128 , 128 , 255 ) , col) ) ;
4447
draw_list-> AddRectFilled ( p_min, p_max, col_bg1, rounding, flags ) ;
4448
4449
int yi = 0 ;
4450
for ( float y = p_min. y + grid_off. y ; y < p_max. y ; y += grid_step, yi+ + )
4451
{
4452
float y1 = ImClamp ( y, p_min. y , p_max. y ) , y2 = ImMin ( y + grid_step, p_max. y ) ;
4453
if ( y2 <= y1)
4454
continue ;
4455
for ( float x = p_min. x + grid_off. x + ( yi & 1 ) * grid_step; x < p_max. x ; x += grid_step * 2.0f )
4456
{
4457
float x1 = ImClamp ( x, p_min. x , p_max. x ) , x2 = ImMin ( x + grid_step, p_max. x ) ;
4458
if ( x2 <= x1)
4459
continue ;
4460
ImDrawFlags cell_flags = ImDrawFlags_RoundCornersNone;
4461
if ( y1 <= p_min. y ) { if ( x1 <= p_min. x ) cell_flags |= ImDrawFlags_RoundCornersTopLeft; if ( x2 >= p_max. x ) cell_flags |= ImDrawFlags_RoundCornersTopRight; }
4462
if ( y2 >= p_max. y ) { if ( x1 <= p_min. x ) cell_flags |= ImDrawFlags_RoundCornersBottomLeft; if ( x2 >= p_max. x ) cell_flags |= ImDrawFlags_RoundCornersBottomRight; }
4463
4464
4465
cell_flags = ( flags == ImDrawFlags_RoundCornersNone || cell_flags == ImDrawFlags_RoundCornersNone) ? ImDrawFlags_RoundCornersNone : ( cell_flags & flags) ;
4466
draw_list-> AddRectFilled ( ImVec2 ( x1, y1 ) , ImVec2 ( x2, y2 ) , col_bg2, rounding, cell_flags) ;
4467
}
4468
}
4469
}
4470
else
4471
{
4472
draw_list-> AddRectFilled ( p_min, p_max, col, rounding, flags ) ;
4473
}
4474
}
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
static unsigned int stb_decompress_length ( const unsigned char * input )
4486
{
4487
return ( input[ 8 ] << 24 ) + ( input[ 9 ] << 16 ) + ( input[ 10 ] << 8 ) + input[ 11 ] ;
4488
}
4489
4490
static unsigned char * stb__barrier_out_e, * stb__barrier_out_b;
4491
static const unsigned char * stb__barrier_in_b;
4492
static unsigned char * stb__dout;
4493
static void stb__match ( const unsigned char * data , unsigned int length )
4494
{
4495
4496
IM_ASSERT ( stb__dout + length <= stb__barrier_out_e ) ;
4497
if ( stb__dout + length > stb__barrier_out_e) { stb__dout += length; return ; }
4498
if ( data < stb__barrier_out_b) { stb__dout = stb__barrier_out_e+ 1 ; return ; }
4499
while ( length- - ) * stb__dout+ + = * data+ + ;
4500
}
4501
4502
static void stb__lit ( const unsigned char * data , unsigned int length )
4503
{
4504
IM_ASSERT ( stb__dout + length <= stb__barrier_out_e ) ;
4505
if ( stb__dout + length > stb__barrier_out_e) { stb__dout += length; return ; }
4506
if ( data < stb__barrier_in_b) { stb__dout = stb__barrier_out_e+ 1 ; return ; }
4507
memcpy ( stb__dout, data, length ) ;
4508
stb__dout += length;
4509
}
4510
4511
#define stb__in2 ( x ) ( ( i[ x] << 8 ) + i[ ( x) + 1 ] )
4512
#define stb__in3 ( x ) ( ( i[ x] << 16 ) + stb__in2 ( ( x) + 1 ) )
4513
#define stb__in4 ( x ) ( ( i[ x] << 24 ) + stb__in3 ( ( x) + 1 ) )
4514
4515
static const unsigned char * stb_decompress_token ( const unsigned char * i )
4516
{
4517
if ( * i >= 0x20 ) {
4518
if ( * i >= 0x80 ) stb__match ( stb__dout- i[ 1 ] - 1 , i[ 0 ] - 0x80 + 1 ) , i += 2 ;
4519
else if ( * i >= 0x40 ) stb__match ( stb__dout- ( stb__in2 ( 0 ) - 0x4000 + 1 ) , i[ 2 ] + 1 ) , i += 3 ;
4520
else stb__lit ( i+ 1 , i[ 0 ] - 0x20 + 1 ) , i += 1 + ( i[ 0 ] - 0x20 + 1 ) ;
4521
} else {
4522
if ( * i >= 0x18 ) stb__match ( stb__dout- ( stb__in3 ( 0 ) - 0x180000 + 1 ) , i[ 3 ] + 1 ) , i += 4 ;
4523
else if ( * i >= 0x10 ) stb__match ( stb__dout- ( stb__in3 ( 0 ) - 0x100000 + 1 ) , stb__in2 ( 3 ) + 1 ) , i += 5 ;
4524
else if ( * i >= 0x08 ) stb__lit ( i+ 2 , stb__in2 ( 0 ) - 0x0800 + 1 ) , i += 2 + ( stb__in2 ( 0 ) - 0x0800 + 1 ) ;
4525
else if ( * i == 0x07 ) stb__lit ( i+ 3 , stb__in2 ( 1 ) + 1 ) , i += 3 + ( stb__in2 ( 1 ) + 1 ) ;
4526
else if ( * i == 0x06 ) stb__match ( stb__dout- ( stb__in3 ( 1 ) + 1 ) , i[ 4 ] + 1 ) , i += 5 ;
4527
else if ( * i == 0x04 ) stb__match ( stb__dout- ( stb__in3 ( 1 ) + 1 ) , stb__in2 ( 4 ) + 1 ) , i += 6 ;
4528
}
4529
return i;
4530
}
4531
4532
static unsigned int stb_adler32 ( unsigned int adler32 , unsigned char * buffer , unsigned int buflen )
4533
{
4534
const unsigned long ADLER_MOD = 65521 ;
4535
unsigned long s1 = adler32 & 0xffff , s2 = adler32 >> 16 ;
4536
unsigned long blocklen = buflen % 5552 ;
4537
4538
unsigned long i;
4539
while ( buflen) {
4540
for ( i= 0 ; i + 7 < blocklen; i += 8 ) {
4541
s1 += buffer[ 0 ] , s2 += s1;
4542
s1 += buffer[ 1 ] , s2 += s1;
4543
s1 += buffer[ 2 ] , s2 += s1;
4544
s1 += buffer[ 3 ] , s2 += s1;
4545
s1 += buffer[ 4 ] , s2 += s1;
4546
s1 += buffer[ 5 ] , s2 += s1;
4547
s1 += buffer[ 6 ] , s2 += s1;
4548
s1 += buffer[ 7 ] , s2 += s1;
4549
4550
buffer += 8 ;
4551
}
4552
4553
for ( ; i < blocklen; + + i)
4554
s1 += * buffer+ + , s2 += s1;
4555
4556
s1 %= ADLER_MOD, s2 %= ADLER_MOD;
4557
buflen -= blocklen;
4558
blocklen = 5552 ;
4559
}
4560
return ( unsigned int ) ( s2 << 16 ) + ( unsigned int ) s1;
4561
}
4562
4563
static unsigned int stb_decompress ( unsigned char * output , const unsigned char * i , unsigned int )
4564
{
4565
if ( stb__in4 ( 0 ) != 0x57bC0000 ) return 0 ;
4566
if ( stb__in4 ( 4 ) != 0 ) return 0 ;
4567
const unsigned int olen = stb_decompress_length ( i ) ;
4568
stb__barrier_in_b = i;
4569
stb__barrier_out_e = output + olen;
4570
stb__barrier_out_b = output;
4571
i += 16 ;
4572
4573
stb__dout = output;
4574
for ( ; ; ) {
4575
const unsigned char * old_i = i;
4576
i = stb_decompress_token ( i ) ;
4577
if ( i == old_i) {
4578
if ( * i == 0x05 && i[ 1 ] == 0xfa ) {
4579
IM_ASSERT ( stb__dout == output + olen ) ;
4580
if ( stb__dout != output + olen) return 0 ;
4581
if ( stb_adler32 ( 1 , output, olen) != ( unsigned int ) stb__in4 ( 2 ) )
4582
return 0 ;
4583
return olen;
4584
} else {
4585
IM_ASSERT ( 0 ) ;
4586
return 0 ;
4587
}
4588
}
4589
IM_ASSERT ( stb__dout <= output + olen ) ;
4590
if ( stb__dout > output + olen)
4591
return 0 ;
4592
}
4593
}
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
static const char proggy_clean_ttf_compressed_data_base85[ 11980 + 1 ] =
4608
" 7])#######hV0qs'/###[),##/l:$#Q6>##5[n42>c-TH`->>#/e>11NNV=Bv(*:.F?uu#(gRU.o0XGH`$vhLG1hxt9?W`#,5LsCp#-i>.r$<$6pD>Lb';9Crc6tgXmKVeU2cD4Eo3R/"
4609
" 2*>]b(MC;$jPfY.;h^`IWM9<Lh2TlS+f-s$o6Q<BWH`YiU.xfLq$N;$0iR/GX:U(jcW2p/W*q?-qmnUCI;jHSAiFWM.R*kU@C=GH?a9wp8f$e.-4^Qg1)Q-GL(lf(r/7GrRgwV%MS=C#"
4610
" `8ND>Qo#t'X#(v#Y9w0#1D$CIf;W'#pWUPXOuxXuU(H9M(1<q-UE31#^-V'8IRUo7Qf./L>=Ke$$'5F%)]0^#[email protected] <r:QLtFsLcL6##lOj)#.Y5<-R&KgLwqJfLgN&;Q?gI^#DY2uL"
4611
" i@^rMl9t=cWq6##weg>$FBjVQTSDgEKnIS7EM9>ZY9w0#L;>>#Mx&4Mvt//L[MkA#[email protected] '[0#7RL_&#w+F%HtG9M#XL`N&.,GM4Pg;-<nLENhvx>-VsM.M0rJfLH2eTM`*oJMHRC`N"
4612
" kfimM2J,W-jXS:)r0wK#@Fge$U>`w'N7G#$#fB#$E^$#:9:hk+eOe--6x)F7*E%?76%^GMHePW-Z5l'&GiF#$956:rS?dA#fiK:)Yr+`�j@'DbG&#^$PG.Ll+DNa<XCMKEV*N)LN/N"
4613
" *b=%Q6pia-Xg8I$<MR&,VdJe$<(7G;Ckl'&hF;;$<_=X(b.RS%% )###MPBuuE1V:v&cXm#(&cV]`k9OhLMbn%s $G2,B$BfD3X*sp5#l,$R#]x_X1xKX%b5U*[r5iMfUo9U`N99hG)"
4614
" tm+/Us9pG)XPu`<0s-)WTt(gCRxIg(%6s fh=ktMKn3j)<6<b5Sk_/0(^]AaN#(p/L>&VZ>1i%h1S9u5o@YaaW$e+b<TWFn/Z:Oh(Cx2$lNEoN^e)#CFY@@I;BOQ*sRwZtZxRcU7uW6CX"
4615
" ow0i(?$Q[cjOd[P4d)]>ROPOpxTO7Stwi1::iB1q)C_=dV26J;2,]7op$]uQr@_V7$q^%lQwtuHY]=DX,n3L#0PHDO4f9>dC@O>HBuKPpP*E,N+b3L#lpR/MrTEH.IAQk.a>D[.e;mc."
4616
" x]Ip.PH^'/aqUO/$1WxLoW0[iLA<QT;5HKD+@qQ'NQ(3_PLhE48R.qAPSwQ0/WK?Z,[x?-J;jQTWA0X@KJ(_Y8N-:/M74:/-ZpKrUss?d#dZq]DAbkU*JqkL+nwX@@47`5>w=4h(9.`G"
4617
" CRUxHPeR`5Mjol(dUWxZa(>STrPkrJiWx`5U7F#.g*jrohGg`cg:lSTvEY/EV_7H4Q9[Z%c nv;JQYZ5q.l7Zeas:HOIZOB?G<Nald$qs]@]L<J7bR*>gv:[7MI2k).'2($5FNP&EQ(,)"
4618
" U]W]+fh18.vsai00);D3@4ku5P?DP8aJt+;qUM]=+b'8@;mViBKx0DE[-auGl8:PJ&Dj+M6OC]O^((##]`0i)drT;-7X`=-H3[igUnPG-NZlo.#k@h#=Ork$m>a>$-?Tm$UV(?#P6YY#"
4619
" '/###xe7q.73rI3*pP/$1>s9)W,JrM7SN]'/4C#v$U`0#V.[0>xQsH$fEmPMgY2u7Kh(G%s iIfLSoS+MK2eTM$=5,M8p`A.;_R%#u [K#$x4AG8.kK/HSB==-'Ie/QTtG?-.*^N-4B/ZM"
4620
" _3YlQC7(p7q)&](`6_c)$/*JL(L-^(]$wIM`dPtOdGA,U3:w2M-0<q-]L_?^)1vw'.,MRsqVr.L;aN&#/EgJ)PBc[-f>+WomX2u7lqM2iEumMTcsF?-aT=Z-97UEnXglEn1K-bnEO`gu"
4621
" Ft(c%=;Am_Qs@jLooI&NX;]0#j4#F14;gl8-GQpgwhrq8'=l_f-b49'UOqkLu7-##oDY2L(te+Mch&gLYtJ,MEtJfLh'x'M=$CS-ZZ%P]8bZ>#S?YY#%Q&q'3^Fw&?D)UDNrocM3A76/"
4622
" /oL?#h7gl85[qW/NDOk%16i j;+:1a'iNIdb-ou8.P*w,v5#EI$TWS>Pot-R*H'-SEpA:g)f+O$%% `kA#G=8RMmG1&O`>to8bC]T&$,n.LoO>29sp3dt-52U%VM#q7'DHpg+#Z9%H[K<L"
4623
" %a 2E-grWVM3@2=-k22tL]4$##6We'8UJCKE[d_=%wI;'6X-GsLX4j^SgJ$##R*w,vP3wK#iiW&#*h^D&R?jp7+/u&#(AP##XU8c$fSYW-J95_-Dp[g9wcO&#M-h1OcJlc-*vpw0xUX&#"
4624
" OQFKNX@QI'IoPp7nb,QU//MQ&ZDkKP)X<WSVL(68uVl&#c'[0#(s1X&xm$Y%B7*K:eDA323j998GXbA#pwMs-jgD$9QISB-A_(aN4xoFM^@C58D0+Q+q3n0#3U1InDjF682-SjMXJK)("
4625
" h$hxua_K]ul92%'BOU&#BRRh-slg8KDlr:%L71Ka:.A;%YULjDPmL<LYs8i#XwJOYaKPKc1h:'9Ke,g)b),78=I39B;xiY$bgGw-&.Zi9InXDuYa%G *f2Bq7mn9^#p1vv%#(Wi-;/Z5h"
4626
" o;#2:;%d 	v68C5g?ntX0X)pT`;%p B3q7mgGN)3%(P8nTd5L7GeA-GL@+%J3u2:(Yf>et`e;)f#Km8&+DC$I46>#Kr]]u-[=99tts1.qb#q72g1WJO81q+eN'03'eM>&1XxY-caEnO"
4627
" j%2n 8)),?ILR5^.Ibn<-X-Mq7[a82Lq:F&#ce+S9wsCK*x`569E8ew'He]h:sI[2LM$[guka3ZRd6:t%IG:;$%YiJ:Nq=?eAw;/:nnDq0(CYcMpG)qLN4$##&J<j$UpK<Q4a1]MupW^-"
4628
" sj_$%[HK%'F####QRZJ::Y3EGl4'@%FkiAOg#p[##O`gukTfBHagL<LHw%q&OV0##F=6/:chIm0@eCP8X] :kFI%hl8hgO@RcBhS-@Qb$%+m=hPDLg*%K8ln(wcf3/'DW-$.lR?n[nCH-"
4629
" eXOONTJlh:.RYF%3'p6sq:UIMA945&^HFS87@$EP2iG<-lCO$%c `uKGD3rC$x0BL8aFn--`ke%#HMP'vh1/R&O_J9'um,.<tx[@%wsJk&bUT2`0uMv7gg#qp/ij.L56'hl;.s5CUrxjO"
4630
" M7-##.l+Au'A&O:-T72L]P`&=;ctp'XScX*rU.>-XTt,%O VU4)S1+R-#dg0/Nn?Ku1^0f$B*P:Rowwm-`0PKjYDDM'3]d39VZHEl4,.j']Pk-M.h^&:0FACm$maq-&sgw0t7/6(^xtk%"
4631
" LuH88Fj-ekm>GA#_>568x6(OFRl-IZp`&b,_P'$M<Jnq79VsJW/mWS*PUiq76;]/NM_>hLbxfc$mj`,O;&%W2m`Zh:/)Uetw:aJ%]K9h:TcF]u_-Sj9,VK3M.*'&0D[Ca]J9gp8,kAW]"
4632
" %(?A%R$f<->Zts'^kn=-^@c4%-p Y6qI%J%1IGxfLU9CP8cbPlXv);C=b),<2mOvP8up,UVf3839acAWAW-W?#ao/^#%KYo8fRULNd2.>%m]UK:n%r$'sw]J;5pAoO_#2mO3n,'=H5(et"
4633
" Hg*`+RLgv>=4U8guD$I%D :W>-r5V*%j*W:Kvej.Lp$<M-SGZ':+Q_k+uvOSLiEo(<aD/K<CCc`'Lx>'?;++O'>()jLR-^u68PHm8ZFWe+ej8h:9r6L*0//c&iH&R8pRbA#Kjm%u pV1g:"
4634
" a_#Ur7FuA#(tRh#.Y5K+@?3<-8m0$PEn;J:rh6?I6uG<-`wMU'ircp0LaE_OtlMb&1#6T.#FDKu#1Lw%u %+G M+X'e?YLfjM[VO0MbuFp7;>Q&#WIo)0@F%q7c#4XAXN-U&VB<HFF*qL("
4635
" $/V,;(kXZejWO`<[5?\? ewY(*9=%wDc;,u<'9t3W-(H1th3+G]ucQ]kLs7df($/*JL]@*t7Bu_G3_7mp7<[email protected] ;x3B0lqp7Hf,^Ze7-##@/c58Mo(3;knp0%)A7?-W+eI'o8)b<"
4636
" nKnw'Ho8C=Y>pqB>0ie&jhZ[?iLR@@_AvA-iQC(=ksRZRVp7`.=+NpBC%rh&3]R:8XDmE5^V8O(x<<aG/1N$#FX$0V5Y6x'aErI3I$7x%E `v<-BY,)%-?Psf*l?%C 3.mM(=/M0:JxG'?"
4637
" 7WhH%o 'a<-80g0NBxoO(GH<dM]n.+%q@jH?f.UsJ2Ggs&4<-e47&Kl+f//9@`b+?.TeN_&B8Ss?v;^Trk;f#YvJkl&w$]>-+k?'(<S:68tq*WoDfZu';mM?8X[ma8W%*`-=;D.(nc7/;"
4638
" )g:T1=^J$&BRV(-lTmNB6xqB[@0*o.erM*<SWF]u2=st-*(6v>^](H.aREZSi,#1:[IXaZFOm<-ui#qUq2$##Ri;u75OK#(RtaW-K-F`S+cF]uN`-KMQ%rP/Xri.LRcB##=YL3BgM/3M"
4639
" D?@f&1'BW-)Ju<L25gl8uhVm1hL$##*8###'A3/LkKW+(^rWX?5W_8g)a(m&K8P>#bmmWCMkk&#TR`C,5d>g)F;t,4:@_l8G/5h4vUd%&%950:VXD'QdWoY-F$BtUwmfe$YqL'8(PWX("
4640
" P?^@Po3$##`MSs?DWBZ/S>+4%>fX,VWv/w'KD`LP5IbH;rTV>n3cEK8U#bX]l-/V+^lj3;vlMb&[5YQ8#pekX9JP3XUC72L,,?+Ni&co7ApnO*5NK,((W-i:$,kp'UDAO(G0Sq7MVjJs"
4641
" bIu)'Z,*[>br5fX^:FPAWr-m2KgL<LUN098kTF&#lvo58=/vjDo;.;)Ka*hLR#/k=rKbxuV`>Q_nN6'8uTGT5g)uLv:873UpTLgH+#FgpH'_o1780Ph8KmxQJ8#H72L4@768@Tm&Q"
4642
" h4CB/5OvmA&,Q&QbUoi$a_%3M01H)4x7I^&KQVgtFnV+;[Pc>[m4k//,]1?#`VY[Jr*3&&slRfLiVZJ:]?=K3Sw=[$=uRB?3xk48@aeg<Z'<$#4H)6,>e0jT6'N#(q%.O =?2S]u*(m<-"
4643
" V8J'(1)G][68hW$5'q[GC&5j`TE?m'esFGNRM)j,ffZ?-qx8;->g4t*:CIP/[Qap7/9'#(1sao7w-.qNUdkJ)tCF&#B^;[email protected] $m%#QvQS8U@)2Z+3K:AKM5i"
4644
" sZ88+dKQ)W6>J%C L<KE>`.d*(B`-n8D9oK<Up]c$X$(,)M8Zt7/[rdkqTgl-0cuGMv'?>-XV1q['-5k'cAZ69e;D_?$ZPP&s^+7])$*$#@QYi9,5P	r+$%C E=68>K8r0=dSC%% (@p7"
4645
" .m7jilQ02'0-VWAg<a/''3u.=4L$Y)6k/K:_[3=&jvL<L0C/2'v:^;-DIBW,B4E68:kZ;%?8(Q8BH=kO65BW?xSG&#@uU,DS*,?.+(o(#1vCS8#CHF>TlGW'b)Tq7VT9q^*^$$.:&N@@"
4646
" $&)WHtPm*5_rO0&e%K&#-30j(E4#'Zb.o/(Tpm$>K'f@[PvFl,hfINTNU6u'0pao7%X Up9]5.>%h`8_=VYbxuel.NTSsJfLacFu3B'lQSu/m6-Oqem8T+oE--$0a/k]uj9EwsG>%ve R*"
4647
" hv^BFpQj:K'#SJ,sB-'#](j.Lg92rTw-*n%@/;39rrJF,l#qV%O rtBeC6/,;qB3ebNW[?,Hqj2L.1NP&GjUR=1D8QaS3Up&@*9wP?+lo7b?@%'k4`p0Z$22%K3+iCZj?XJN4Nm&+YF]u"
4648
" @-W$U%VEQ/,,>>#)D<h#`)h0:<Q6909ua+&VU%n 2:cG3FJ-%@Bj-DgLr`Hw&HAKjKjseK</xKT*)B,N9X3]krc12t'pgTV(Lv-tL[xg_%=M_q7a^x?7Ubd>#%8c Y#YZ?=,`Wdxu/ae&#"
4649
" w6)R89tI#6@s'(6Bf7a&?S=^ZI_kS&ai`&=tE72L_D,;^R)7[$s<Eh#c&)q.MXI%#v9ROa5FZO%s F7q7Nwb&#ptUJ:aqJe$Sl68%.D ###EC><?-aF&#RNQv>o8lKN%5/$(vdfq7+ebA#"
4650
" u1p]ovUKW&Y%q]'>$1@-[xfn$7ZTp7mM,G,Ko7a&Gu%G [RMxJs[0MM%wci.LFDK)(<c`Q8N)jEIF*+?P2a8g%)$q]o2aH8C&<SibC/q,(e:v;-b#6[$NtDZ84Je2KNvB#$P5?tQ3nt(0"
4651
" d=j.LQf./Ll33+(;q3L-w=8dX$#WF&uIJ@-bfI>%:_i2B5CsR8&9Z&#=mPEnm0f`<&c)QL5uJ#%u %lJj+D-r;BoFDoS97h5g)E#o:&S4weDF,9^Hoe`h*L+_a*NrLW-1pG_&2UdB8"
4652
" 6e%B/:=>)N4xeW.*wft-;$'58-ESqr<b?UI(_%@[P46>#U`'6AQ]m&6/`Z>#S?YY#Vc;r7U2&326d=w&H####?TZ`*4?&.MK?LP8Vxg>$[QXc%QJv92.(Db*B)gb*BM9dM*hJMAo*c&#"
4653
" b0v=Pjer]$gG&JXDf->'StvU7505l9$AFvgYRI^&<^b68?j#q9QX4SM'RO#&sL1IM.rJfLUAj221]d##DW=m83u5;'bYx,*Sl0hL(W;;$doB&O/TQ:(Z^xBdLjL<Lni;''X.`$#8+1GD"
4654
" :k$YUWsbn8ogh6rxZ2Z9]%n d+>V#*8U_72Lh+2Q8Cj0i:6hp&$C/:p(HK>T8Y[gHQ4`4)'$Ab(Nof%V'8hL&#<NEdtg(n'=S1A(Q1/I&4([%d M`,Iu'1:_hL>SfD07&6D<fp8dHM7/g+"
4655
" tlPN9J*rKaPct&?'uBCem^jn%9_K)<,C5K3s=5g&GmJb*[SYq7K;TRLGCsM-$$;S%:Y@r7AK0pprpL<Lrh,q7e/%KWK:50I^+m'vi`3?%Zp+<-d+$L-Sv:@.o19n$s0&39;kn;S%BSq*"
4656
" $3WoJSCLweV[aZ'MQIjO<7;X-X;&+dMLvu#^UsGEC9WEc[X(wI7#2.(F0jV*eZf<-Qv3J-c+J5AlrB#$p(H68LvEA'q3n0#m,[`*8Ft)FcYgEud]CWfm68,(aLA$@EFTgLXoBq/UPlp7"
4657
" :d[/;r_ix=:TF`S5H-b<LI&HY(K=h#)]Lk$K14lVfm:x$H<3^Ql<M`$OhapBnkup'D#L$Pb_`N*g]2e;X/Dtg,bsj&K#2[-:iYr'_wgH)NUIR8a1n#S?Yej'h8^58UbZd+^FKD*T@;6A"
4658
" 7aQC[K8d-(v6GI$x:T<&'Gp5Uf>@M.*J:;$-rv29'M]8qMv-tLp,'886iaC=Hb*YJoKJ,(j%K=H`K.v9HggqBIiZu'QvBT.#=)0ukruV&.)3=(^1`o*Pj4<-<aN((^7('#Z0wK#5GX@7"
4659
" u][`*S^43933A4rl][`*O4CgLEl]v$1Q3AeF37dbXk,.)vj#x'd`;qgbQR%F W,2(?LO=s%S c68%NP'##Aotl8x=BE#j1UD([3$M(]UI2LX3RpKN@;/#f'f/&_mt&F)XdF<9t4)Qa.*kT"
4660
" LwQ'(TTB9.xH'>#MJ+gLq9-##@HuZPN0]u:h7.T..G:;$/Usj(T7`Q8tT72LnYl<-qx8;-HV7Q-&Xdx%1a ,hC=0u+HlsV>nuIQL-5<N?)NBS)QN*_I,?&)2'IM%L3I)X((e/dl2&8'<M"
4661
" :^#M*Q+[T.Xri.LYS3v%f F`68h;b-X[/En'CR.q7E)p'/kle2HM,u;^%O KC-N+Ll%F 9CF<Nf'^#t2L,;27W:0O@6##U6W7:$rJfLWHj$#)woqBefIZ.PK<b*t7ed;p*_m;4ExK#h@&]>"
4662
" _>@kXQtMacfD.m-VAb8;IReM3$wf0''hra*so568'Ip&vRs849'MRYSp%:t:h5qSgwpEr$B>Q,;s(C#$)`svQuF$##-D,##,g68@2[T;.XSdN9Qe)rpt._K-#5wF)sP'##p#C0c%-G b%"
4663
" hd+<-j'Ai*x&&HMkT]C'OSl##5RG[JXaHN;d'uA#x._U;.`PU@(Z3dt4r152@:v,'R.Sj'w#0<-;kPI)FfJ&#AYJ&#//)>-k=m=*XnK$>=)72L]0I%>.G690a:$##<,);?;72#?x9+d;"
4664
" ^V'9;jY@;)br#q^YQpx:X#Te$Z^'=-=bGhLf:D6&bNwZ9-ZD#n^9HhLMr5G;']d&6'wYmTFmL<LD)F^%[tC'8;+9E#C$g%#5Y>q9wI>P(9mI[>kC-ekLC/R&CH+s'B;K-M6$EB%i s00:"
4665
" +A4[7xks.LrNk0&E)wILYF@2L'0Nb$+pv<(2.768/FrY&h$^3i&@+G%JT'<-,v`3;_)I9M^AE]CN?Cl2AZg+%4i TpT3<n-&%H%b<FDj2M<hH=&Eh<2Len$b*aTX=-8QxN)k11IM1c^j%"
4666
" 9s<L<NFSo)B?+<-(GxsF,^-Eh@$4dXhN$+#rxK8'je'D7k`e;)2pYwPA'_p9&@^18ml1^[@g4t*[JOa*[=Qp7(qJ_oOL^('7fB&Hq-:sf,sNj8xq^>$U4O]GKx'm9)b@p7YsvK3w^YR-"
4667
" CdQ*:Ir<($u&)#(&?L9Rg3H)4fiEp^iI9O8KnTj,]H?D*r7'M;PwZ9K0E^k&-cpI;.p/6_vwoFMV<->#%X i.LxVnrU(4&8/P+:hLSKj$#U%]49t'I:rgMi'FL@a:0Y-uA[39',(vbma*"
4668
" hU%<-SRF`Tt:542R_VV$p@[p8DV[A,?1839FWdF<TddF<9Ah-6&9tWoDlh]&1SpGMq>Ti1O*H&#(AL8[_P%.M>v^-))qOT*F5Cq0`Ye%+$B6i:7@0IX<N+T+0MlMBPQ*Vj>SsD<U4JHY"
4669
" 8kD2)2fU/M#$e.)T4,_=8hLim[&);?UkK'-x?'(:siIfL<$pFM`i<?%W(mGDHM%>iWP,##P`%/L<eXi:@Z9C.7o=@(pXdAO/NLQ8lPl+HPOQa8wD8=^GlPa8TKI1CjhsCTSLJM'/Wl>-"
4670
" S(qw%s f/@%#B6;/U7K]uZbi^Oc^2n<bhPmUkMw>%t<)'mEVE''n`WnJra$^TKvX5B>;_aSEK',(hwa0:i4G?.Bci.(X[?b*($,=-n<.Q%`(X=?+@Am*Js0&=3bh8K]mL<LoNs'6,'85`"
4671
" 0?t/'_U59@]ddF<#LdF<eWdF<OuN/45rY<-L@&#+fm>69=Lb,OcZV/);TTm8VI;?%O tJ<(b4mq7M6:u?KRdF<gR@2L=FNU-<b[(9c/ML3m;Z[$oF3g)GAWqpARc=<ROu7cL5l;-[A]%/"
4672
" +fsd;l#SafT/f*W]0=O'$(Tb<[)*@e775R-:Yob%g *>l*:xP?Yb.5)%w_I?7uk5JC+FS(m#i'k.'a0i)9<7b'fs'59hq$*5Uhv##pi^8+hIEBF`nvo`;'l0.^S1<-wUK2/Coh58KKhLj"
4673
" M=SO*rfO`+qC`W-On.=AJ56>>i2@2LH6A:&5q`?9I3@@'04&p2/LVa*T-4<-i3;M9UvZd+N7>b*eIwg:CC)c<>nO&#<IGe;__.thjZl<%w(Wk2xmp4Q@I#I9,DF]u7-P=.-_:YJ]aS@V"
4674
" ?6*C()dOp7:WL,b&3Rg/.cmM9&r^>$(>.Z-I&J(Q0Hd5Q%7C o-b`-c<N(6r@ip+AurK<m86QIth*#v;-OBqi+L7wDE-Ir8K['m+DDSLwK&/.?-V%U _%3:qKNu$_b*B-kp7NaD'QdWQPK"
4675
" Yq[@>P)hI;*_F]u`Rb[.j8_Q/<&>uu+VsH$sM9TA%?)(vmJ80),P7E>)tjD%2L=-t#fK[%`v=Q8<FfNkgg^oIbah*#8/Qt$F&:K*-(N/'+1vMB,u()-a.VUU*#[e%g AAO(S>WlA2);Sa"
4676
" >gXm8YB`1d@K#n]76-a$U,mF<fX]idqd)<3,]J7JmW4`6]uks=4-72L(jEk+:bJ0M^q-8Dm_Z?0olP1C9Sa&H[d&c$ooQUj]Exd*3ZM@-WGW2%s ',B-_M%>%U l:#/'xoFM9QX-$.QN'>"
4677
" [%$Z$uF6pA6Ki2O5:8w*vP1<-1`[G,)-m#>0`P&#eb#.3i)rtB61(o'$?X3B</R90;eZ]%Ncq;-Tl]#F>2Qft^ae_5tKL9MUe9b*sLEQ95C&`=G?@Mj=wh*'3E>=-<)Gt*Iw)'QG:`@I"
4678
" wOf7&]1i'S01B+Ev/Nac#9S;=;YQpg_6U`*kVY39xK,[/6Aj7:'1Bm-_1EYfa1+o&o4hp7KN_Q(OlIo@S%;jVdn0'1<Vc52=u`3^o-n1'g4v58Hj&6_t7$##?M)c<$bgQ_'SY((-xkA#"
4679
" Y(,p'H9rIVY-b,'%bCPF7.J<Up^,(dU1VY*5#WkTU>h19w,WQhLI)3S#f$2(eb,jr*b;3Vw]*7NH%$c4Vs,eD9>XW8?N]o+(*pgC%/72LV-u<Hp,3@e^9UB1J+ak9-TN/mhKPg+AJYd$"
4680
" MlvAF_jCK*.O-^(63adMT->W%i ewS8W6m2rtCpo'RS1R84=@paTKt)>=%&1[)*vp'u+x,VrwN;&]kuO9JDbg=pO$J*.jVe;u'm0dr9l,<*wMK*Oe=g8lV_KEBFkO'oU]^=[-792#ok,)"
4681
" i]lR8qQ2oA8wcRCZ^7w/Njh;?.stX?Q1>S1q4Bn$)K1<-rGdO'$Wr.Lc.CG)$/*JL4tNR/,SVO3,aUw'DJN:)Ss;wGn9A32ijw%F L+Z0Fn.U9;reSq)bmI32U==5ALuG&#Vf1398/pVo"
4682
" 1*c-(aY168o<`JsSbk-,1N;$>0:OUas(3:8Z972LSfF8eb=c-;>SPw7.6hn3m`9^Xkn(r.qS[0;T%&Qc=+STRxX'q1BNk3&*eu2;&8q$&x>Q#Q7^Tf+6<(d%ZVmj2bDi%.3L2n+4W'$P"
4683
" iDDG)g,r%+?,$@?uou5tSe2aN_AQU*<h`e-GI7)?OK2A.d7_c)?wQ5AS@DL3r#7fSkgl6-++D:'A,uq7SvlB$pcpH'q3n0#_%d Y#xCpr-l<F0NR@-##FEV6NTF6##$l84N1w?AO>'IAO"
4684
" URQ##V^Fv-XFbGM7Fl(N<3DhLGF%q.1rC$#:T__&Pi68%0x i_&[qFJ(77j_&JWoF.V735&T,[R*:xFR*K5>>#`bW-?4Ne_&6Ne_&6Ne_&n`kr-#GJcM6X;uM6X;uM(.a..^2TkL%o R(#"
4685
" ;u.T%f Ar%4tJ8&><1=GHZ_+m9/#H1F^R#SC#*N=BA9(D?v[UiFY>>^8p,KKF.W]L29uLkLlu/+4T<XoIB&hx=T1PcDaB&;HH+-AFr?(m9HZV)FKS8JCw;SD=6[^/DZUL`EUDf]GGlG&>"
4686
" w$)F./^n3+rlo+DB;5sIYGNk+i1t-69Jg--0pao7Sm#K)pdHW&;LuDNH@H>#/X-TI(;P>#,Gc>#0Su>#4`1?#8lC?#<xU?#@.i?#D:%@#HF7@#LRI@#P_[@#Tkn@#Xw*A#]-=A#a9OA#"
4687
" d<F&#*;G##.GY##2Sl##6`($#:l:$#>xL$#B.`$#F:r$#JF.%#NR@%#R_R%#Vke%#Zww%#_-4^Rh%S flr-k'MS.o?.5/sWel/wpEM0%3'/1)K^f1-d>G21&v(35>V`39V7A4=onx4"
4688
" A1OY5EI0;6Ibgr6M$HS7Q<)58C5w,;WoA*#[%T*#`1g*#d=#+#hI5+#lUG+#pbY+#tnl+#x$),#&1;,#*=M,#.I`,#2Ur,#6b.-#;w[H#iQtA#m^0B#qjBB#uvTB##-hB#'9$C#+E6C#"
4689
" /QHC#3^ZC#7jmC#;v)D#?,<D#C8ND#GDaD#KPsD#O]/E#g1A5#KA*1#gC17#MGd;#8(02#L-d3#rWM4#Hga1#,<w0#T.j<#O#'2#CYN1#qa^:#_4m3#o@/=#eG8=#t8J5#`+78#4uI-#"
4690
" m3B2#SB[8#Q0@8#i[*9#iOn8#1Nm;#^sN9#qh<9#:=x-#P;K2#$%X 9#bC+.#Rg;<#mN=.#MTF.#RZO.#2?)4#Y#(/#[)1/#b;L/#dAU/#0Sv;#lY$0#n`-0#sf60#(F24#wrH0#%/e0#"
4691
" TmD<#%JSMFove:CTBEXI:<eh2g)B,3h2^G3i;#d3jD>)4kMYD4lVu`4m`:&5niUA5@(A5BA1]PBB:xlBCC=2CDLXMCEUtiCf&0g2'tN?PGT4CPGT4CPGT4CPGT4CPGT4CPGT4CPGT4CP"
4692
" GT4CPGT4CPGT4CPGT4CPGT4CPGT4CP-qekC`.9kEg^+F$kwViFJTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5o,^<-28ZI'O?;xp"
4693
" O?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xp;7q-#lLYI:xvD=#" ;
4694
4695
static const char * GetDefaultCompressedFontDataTTFBase85 ( )
4696
{
4697
return proggy_clean_ttf_compressed_data_base85;
4698
}
4699
4700
#endif