25 #if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
26 #define _CRT_SECURE_NO_WARNINGS
32 #ifndef IMGUI_DEFINE_MATH_OPERATORS
33 #define IMGUI_DEFINE_MATH_OPERATORS
39 #if defined(__GLIBC__) || defined(__sun) || defined(__CYGWIN__) || defined(__APPLE__) || defined(__SWITCH__)
44 #define alloca _alloca // for clang with MS Codegen
53 #pragma warning (disable: 4127) // condition expression is constant
54 #pragma warning (disable: 4505) // unreferenced local function has been removed (stb stuff)
55 #pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
59 #if defined(__clang__)
60 #pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse.
61 #pragma clang diagnostic ignored "-Wfloat-equal" // warning : comparing floating point with == or != is unsafe // storing and comparing against same constants ok.
62 #pragma clang diagnostic ignored "-Wglobal-constructors" // warning : declaration requires a global destructor // similar to above, not sure what the exact difference is.
63 #pragma clang diagnostic ignored "-Wsign-conversion" // warning : implicit conversion changes signedness //
64 #if __has_warning("-Wzero-as-null-pointer-constant")
65 #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning : zero as null pointer constant // some standard header variations use #define NULL 0
67 #if __has_warning("-Wcomma")
68 #pragma clang diagnostic ignored "-Wcomma" // warning : possible misuse of comma operator here //
70 #if __has_warning("-Wreserved-id-macro")
71 #pragma clang diagnostic ignored "-Wreserved-id-macro" // warning : macro name is a reserved identifier //
73 #if __has_warning("-Wdouble-promotion")
74 #pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double.
76 #elif defined(__GNUC__)
77 #pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
78 #pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
79 #pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
80 #pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
81 #pragma GCC diagnostic ignored "-Wstack-protector" // warning: stack protector not protecting local variables: variable length buffer
82 #pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
96 #ifdef IMGUI_STB_NAMESPACE
97 namespace IMGUI_STB_NAMESPACE
102 #pragma warning (push)
103 #pragma warning (disable: 4456) // declaration of 'xx' hides previous local declaration
106 #if defined(__clang__)
107 #pragma clang diagnostic push
108 #pragma clang diagnostic ignored "-Wunused-function"
109 #pragma clang diagnostic ignored "-Wmissing-prototypes"
110 #pragma clang diagnostic ignored "-Wimplicit-fallthrough"
111 #pragma clang diagnostic ignored "-Wcast-qual" // warning : cast from 'const xxxx *' to 'xxx *' drops const qualifier //
114 #if defined(__GNUC__)
115 #pragma GCC diagnostic push
116 #pragma GCC diagnostic ignored "-Wtype-limits" // warning: comparison is always true due to limited range of data type [-Wtype-limits]
117 #pragma GCC diagnostic ignored "-Wcast-qual" // warning: cast from type 'const xxxx *' to type 'xxxx *' casts away qualifiers
120 #ifndef STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds)
121 #ifndef IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION
123 #define STBRP_ASSERT(x) IM_ASSERT(x)
124 #define STBRP_SORT ImQsort
125 #define STB_RECT_PACK_IMPLEMENTATION
127 #ifdef IMGUI_STB_RECT_PACK_FILENAME
128 #include IMGUI_STB_RECT_PACK_FILENAME
134 #ifndef STB_TRUETYPE_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds)
135 #ifndef IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION
136 #define STBTT_malloc(x,u) ((void)(u), IM_ALLOC(x))
137 #define STBTT_free(x,u) ((void)(u), IM_FREE(x))
138 #define STBTT_assert(x) IM_ASSERT(x)
139 #define STBTT_fmod(x,y) ImFmod(x,y)
140 #define STBTT_sqrt(x) ImSqrt(x)
141 #define STBTT_pow(x,y) ImPow(x,y)
142 #define STBTT_fabs(x) ImFabs(x)
143 #define STBTT_ifloor(x) ((int)ImFloorStd(x))
144 #define STBTT_iceil(x) ((int)ImCeil(x))
146 #define STB_TRUETYPE_IMPLEMENTATION
148 #define STBTT_DEF extern
150 #ifdef IMGUI_STB_TRUETYPE_FILENAME
151 #include IMGUI_STB_TRUETYPE_FILENAME
157 #if defined(__GNUC__)
158 #pragma GCC diagnostic pop
161 #if defined(__clang__)
162 #pragma clang diagnostic pop
165 #if defined(_MSC_VER)
166 #pragma warning (pop)
169 #ifdef IMGUI_STB_NAMESPACE
171 using namespace IMGUI_STB_NAMESPACE;
352 CurveTessellationTol = 0.0f;
353 CircleSegmentMaxError = 0.0f;
354 ClipRectFullscreen =
ImVec4(-8192.0
f, -8192.0
f, +8192.0
f, +8192.0
f);
363 memset(CircleSegmentCounts, 0,
sizeof(CircleSegmentCounts));
368 if (CircleSegmentMaxError == max_error)
370 CircleSegmentMaxError = max_error;
373 const float radius =
i + 1.0f;
375 CircleSegmentCounts[
i] = (
ImU8)
ImMin(segment_count, 255);
385 _VtxCurrentOffset = 0;
389 _ClipRectStack.resize(0);
390 _TextureIdStack.resize(0);
403 _ClipRectStack.clear();
404 _TextureIdStack.clear();
406 _Splitter.ClearFreeMemory();
412 dst->CmdBuffer = CmdBuffer;
413 dst->IdxBuffer = IdxBuffer;
414 dst->VtxBuffer = VtxBuffer;
420 #define GetCurrentClipRect() (_ClipRectStack.Size ? _ClipRectStack.Data[_ClipRectStack.Size-1] : _Data->ClipRectFullscreen)
421 #define GetCurrentTextureId() (_TextureIdStack.Size ? _TextureIdStack.Data[_TextureIdStack.Size-1] : (ImTextureID)NULL)
432 CmdBuffer.push_back(draw_cmd);
437 ImDrawCmd* current_cmd = CmdBuffer.Size ? &CmdBuffer.back() :
NULL;
441 current_cmd = &CmdBuffer.back();
455 ImDrawCmd* curr_cmd = CmdBuffer.Size > 0 ? &CmdBuffer.Data[CmdBuffer.Size-1] :
NULL;
463 ImDrawCmd* prev_cmd = CmdBuffer.Size > 1 ? curr_cmd - 1 :
NULL;
465 CmdBuffer.pop_back();
467 curr_cmd->
ClipRect = curr_clip_rect;
474 ImDrawCmd* curr_cmd = CmdBuffer.Size ? &CmdBuffer.back() :
NULL;
482 ImDrawCmd* prev_cmd = CmdBuffer.Size > 1 ? curr_cmd - 1 :
NULL;
484 CmdBuffer.pop_back();
489 #undef GetCurrentClipRect
490 #undef GetCurrentTextureId
495 ImVec4 cr(cr_min.
x, cr_min.
y, cr_max.
x, cr_max.
y);
496 if (intersect_with_current_clip_rect && _ClipRectStack.Size)
498 ImVec4 current = _ClipRectStack.Data[_ClipRectStack.Size-1];
499 if (cr.
x < current.
x) cr.
x = current.
x;
500 if (cr.
y < current.
y) cr.
y = current.
y;
501 if (cr.
z > current.
z) cr.
z = current.
z;
502 if (cr.
w > current.
w) cr.
w = current.
w;
507 _ClipRectStack.push_back(cr);
513 PushClipRect(
ImVec2(_Data->ClipRectFullscreen.x, _Data->ClipRectFullscreen.y),
ImVec2(_Data->ClipRectFullscreen.z, _Data->ClipRectFullscreen.w));
519 _ClipRectStack.pop_back();
525 _TextureIdStack.push_back(texture_id);
532 _TextureIdStack.pop_back();
545 _VtxCurrentOffset = VtxBuffer.Size;
550 ImDrawCmd& draw_cmd = CmdBuffer.Data[CmdBuffer.Size - 1];
553 int vtx_buffer_old_size = VtxBuffer.Size;
554 VtxBuffer.resize(vtx_buffer_old_size + vtx_count);
555 _VtxWritePtr = VtxBuffer.Data + vtx_buffer_old_size;
557 int idx_buffer_old_size = IdxBuffer.Size;
558 IdxBuffer.resize(idx_buffer_old_size + idx_count);
559 _IdxWritePtr = IdxBuffer.Data + idx_buffer_old_size;
567 ImDrawCmd& draw_cmd = CmdBuffer.Data[CmdBuffer.Size - 1];
569 VtxBuffer.shrink(VtxBuffer.Size - vtx_count);
570 IdxBuffer.shrink(IdxBuffer.Size - idx_count);
576 ImVec2 b(c.
x,
a.y),
d(
a.x, c.
y), uv(_Data->TexUvWhitePixel);
580 _VtxWritePtr[0].pos =
a; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;
581 _VtxWritePtr[1].pos =
b; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col;
582 _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col;
583 _VtxWritePtr[3].pos =
d; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col;
591 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);
595 _VtxWritePtr[0].pos =
a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col;
596 _VtxWritePtr[1].pos =
b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col;
597 _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col;
598 _VtxWritePtr[3].pos =
d; _VtxWritePtr[3].uv = uv_d; _VtxWritePtr[3].col = col;
609 _VtxWritePtr[0].pos =
a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col;
610 _VtxWritePtr[1].pos =
b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col;
611 _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col;
612 _VtxWritePtr[3].pos =
d; _VtxWritePtr[3].uv = uv_d; _VtxWritePtr[3].col = col;
620 #define IM_NORMALIZE2F_OVER_ZERO(VX,VY) do { float d2 = VX*VX + VY*VY; if (d2 > 0.0f) { float inv_len = 1.0f / ImSqrt(d2); VX *= inv_len; VY *= inv_len; } } while (0)
621 #define IM_FIXNORMAL2F(VX,VY) do { float d2 = VX*VX + VY*VY; if (d2 < 0.5f) d2 = 0.5f; float inv_lensq = 1.0f / d2; VX *= inv_lensq; VY *= inv_lensq; } while (0)
627 if (points_count < 2)
630 const ImVec2 uv = _Data->TexUvWhitePixel;
632 int count = points_count;
634 count = points_count-1;
636 const bool thick_line = thickness > 1.0f;
640 const float AA_SIZE = 1.0f;
643 const int idx_count = thick_line ?
count*18 :
count*12;
644 const int vtx_count = thick_line ? points_count*4 : points_count*3;
645 PrimReserve(idx_count, vtx_count);
648 ImVec2* temp_normals = (
ImVec2*)alloca(points_count * (thick_line ? 5 : 3) *
sizeof(
ImVec2));
649 ImVec2* temp_points = temp_normals + points_count;
651 for (
int i1 = 0; i1 <
count; i1++)
653 const int i2 = (i1+1) == points_count ? 0 : i1+1;
654 float dx = points[i2].
x - points[i1].
x;
655 float dy = points[i2].
y - points[i1].
y;
657 temp_normals[i1].
x = dy;
658 temp_normals[i1].
y = -dx;
661 temp_normals[points_count-1] = temp_normals[points_count-2];
667 temp_points[0] = points[0] + temp_normals[0] * AA_SIZE;
668 temp_points[1] = points[0] - temp_normals[0] * AA_SIZE;
669 temp_points[(points_count-1)*2+0] = points[points_count-1] + temp_normals[points_count-1] * AA_SIZE;
670 temp_points[(points_count-1)*2+1] = points[points_count-1] - temp_normals[points_count-1] * AA_SIZE;
674 unsigned int idx1 = _VtxCurrentIdx;
675 for (
int i1 = 0; i1 <
count; i1++)
677 const int i2 = (i1+1) == points_count ? 0 : i1+1;
678 unsigned int idx2 = (i1+1) == points_count ? _VtxCurrentIdx : idx1+3;
681 float dm_x = (temp_normals[i1].
x + temp_normals[i2].
x) * 0.5
f;
682 float dm_y = (temp_normals[i1].
y + temp_normals[i2].
y) * 0.5
f;
688 ImVec2* out_vtx = &temp_points[i2*2];
689 out_vtx[0].
x = points[i2].
x + dm_x;
690 out_vtx[0].
y = points[i2].
y + dm_y;
691 out_vtx[1].
x = points[i2].
x - dm_x;
692 out_vtx[1].
y = points[i2].
y - dm_y;
705 for (
int i = 0;
i < points_count;
i++)
707 _VtxWritePtr[0].pos = points[
i]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;
708 _VtxWritePtr[1].pos = temp_points[
i*2+0]; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col_trans;
709 _VtxWritePtr[2].pos = temp_points[
i*2+1]; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col_trans;
715 const float half_inner_thickness = (thickness - AA_SIZE) * 0.5
f;
718 temp_points[0] = points[0] + temp_normals[0] * (half_inner_thickness + AA_SIZE);
719 temp_points[1] = points[0] + temp_normals[0] * (half_inner_thickness);
720 temp_points[2] = points[0] - temp_normals[0] * (half_inner_thickness);
721 temp_points[3] = points[0] - temp_normals[0] * (half_inner_thickness + AA_SIZE);
722 temp_points[(points_count-1)*4+0] = points[points_count-1] + temp_normals[points_count-1] * (half_inner_thickness + AA_SIZE);
723 temp_points[(points_count-1)*4+1] = points[points_count-1] + temp_normals[points_count-1] * (half_inner_thickness);
724 temp_points[(points_count-1)*4+2] = points[points_count-1] - temp_normals[points_count-1] * (half_inner_thickness);
725 temp_points[(points_count-1)*4+3] = points[points_count-1] - temp_normals[points_count-1] * (half_inner_thickness + AA_SIZE);
729 unsigned int idx1 = _VtxCurrentIdx;
730 for (
int i1 = 0; i1 <
count; i1++)
732 const int i2 = (i1+1) == points_count ? 0 : i1+1;
733 unsigned int idx2 = (i1+1) == points_count ? _VtxCurrentIdx : idx1+4;
736 float dm_x = (temp_normals[i1].
x + temp_normals[i2].
x) * 0.5
f;
737 float dm_y = (temp_normals[i1].
y + temp_normals[i2].
y) * 0.5
f;
739 float dm_out_x = dm_x * (half_inner_thickness + AA_SIZE);
740 float dm_out_y = dm_y * (half_inner_thickness + AA_SIZE);
741 float dm_in_x = dm_x * half_inner_thickness;
742 float dm_in_y = dm_y * half_inner_thickness;
745 ImVec2* out_vtx = &temp_points[i2*4];
746 out_vtx[0].
x = points[i2].
x + dm_out_x;
747 out_vtx[0].
y = points[i2].
y + dm_out_y;
748 out_vtx[1].
x = points[i2].
x + dm_in_x;
749 out_vtx[1].
y = points[i2].
y + dm_in_y;
750 out_vtx[2].
x = points[i2].
x - dm_in_x;
751 out_vtx[2].
y = points[i2].
y - dm_in_y;
752 out_vtx[3].
x = points[i2].
x - dm_out_x;
753 out_vtx[3].
y = points[i2].
y - dm_out_y;
768 for (
int i = 0;
i < points_count;
i++)
770 _VtxWritePtr[0].pos = temp_points[
i*4+0]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col_trans;
771 _VtxWritePtr[1].pos = temp_points[
i*4+1]; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col;
772 _VtxWritePtr[2].pos = temp_points[
i*4+2]; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col;
773 _VtxWritePtr[3].pos = temp_points[
i*4+3]; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col_trans;
782 const int idx_count =
count*6;
783 const int vtx_count =
count*4;
784 PrimReserve(idx_count, vtx_count);
786 for (
int i1 = 0; i1 <
count; i1++)
788 const int i2 = (i1+1) == points_count ? 0 : i1+1;
789 const ImVec2& p1 = points[i1];
790 const ImVec2& p2 = points[i2];
792 float dx = p2.
x - p1.
x;
793 float dy = p2.
y - p1.
y;
795 dx *= (thickness * 0.5f);
796 dy *= (thickness * 0.5f);
798 _VtxWritePtr[0].pos.x = p1.
x + dy; _VtxWritePtr[0].pos.y = p1.
y - dx; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;
799 _VtxWritePtr[1].pos.
x = p2.
x + dy; _VtxWritePtr[1].pos.y = p2.
y - dx; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col;
800 _VtxWritePtr[2].pos.
x = p2.
x - dy; _VtxWritePtr[2].pos.y = p2.
y + dx; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col;
801 _VtxWritePtr[3].pos.
x = p1.
x - dy; _VtxWritePtr[3].pos.y = p1.
y + dx; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col;
804 _IdxWritePtr[0] = (
ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (
ImDrawIdx)(_VtxCurrentIdx+1); _IdxWritePtr[2] = (
ImDrawIdx)(_VtxCurrentIdx+2);
805 _IdxWritePtr[3] = (
ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (
ImDrawIdx)(_VtxCurrentIdx+2); _IdxWritePtr[5] = (
ImDrawIdx)(_VtxCurrentIdx+3);
815 if (points_count < 3)
818 const ImVec2 uv = _Data->TexUvWhitePixel;
823 const float AA_SIZE = 1.0f;
825 const int idx_count = (points_count-2)*3 + points_count*6;
826 const int vtx_count = (points_count*2);
827 PrimReserve(idx_count, vtx_count);
830 unsigned int vtx_inner_idx = _VtxCurrentIdx;
831 unsigned int vtx_outer_idx = _VtxCurrentIdx+1;
832 for (
int i = 2;
i < points_count;
i++)
834 _IdxWritePtr[0] = (
ImDrawIdx)(vtx_inner_idx); _IdxWritePtr[1] = (
ImDrawIdx)(vtx_inner_idx+((
i-1)<<1)); _IdxWritePtr[2] = (
ImDrawIdx)(vtx_inner_idx+(
i<<1));
840 for (
int i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++)
842 const ImVec2& p0 = points[i0];
843 const ImVec2& p1 = points[i1];
844 float dx = p1.
x - p0.
x;
845 float dy = p1.
y - p0.
y;
847 temp_normals[i0].
x = dy;
848 temp_normals[i0].
y = -dx;
851 for (
int i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++)
854 const ImVec2& n0 = temp_normals[i0];
855 const ImVec2& n1 = temp_normals[i1];
856 float dm_x = (n0.
x + n1.
x) * 0.5
f;
857 float dm_y = (n0.
y + n1.
y) * 0.5
f;
859 dm_x *= AA_SIZE * 0.5f;
860 dm_y *= AA_SIZE * 0.5f;
863 _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;
864 _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;
868 _IdxWritePtr[0] = (
ImDrawIdx)(vtx_inner_idx+(i1<<1)); _IdxWritePtr[1] = (
ImDrawIdx)(vtx_inner_idx+(i0<<1)); _IdxWritePtr[2] = (
ImDrawIdx)(vtx_outer_idx+(i0<<1));
869 _IdxWritePtr[3] = (
ImDrawIdx)(vtx_outer_idx+(i0<<1)); _IdxWritePtr[4] = (
ImDrawIdx)(vtx_outer_idx+(i1<<1)); _IdxWritePtr[5] = (
ImDrawIdx)(vtx_inner_idx+(i1<<1));
877 const int idx_count = (points_count-2)*3;
878 const int vtx_count = points_count;
879 PrimReserve(idx_count, vtx_count);
880 for (
int i = 0;
i < vtx_count;
i++)
882 _VtxWritePtr[0].pos = points[
i]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;
885 for (
int i = 2;
i < points_count;
i++)
887 _IdxWritePtr[0] = (
ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (
ImDrawIdx)(_VtxCurrentIdx+
i-1); _IdxWritePtr[2] = (
ImDrawIdx)(_VtxCurrentIdx+
i);
896 if (radius == 0.0
f || a_min_of_12 > a_max_of_12)
898 _Path.push_back(center);
904 #if IM_DRAWLIST_ARCFAST_TESSELLATION_MULTIPLIER != 1
909 _Path.reserve(_Path.Size + (a_max_of_12 - a_min_of_12 + 1));
910 for (
int a = a_min_of_12;
a <= a_max_of_12;
a++)
913 _Path.push_back(
ImVec2(center.
x + c.
x * radius, center.
y + c.
y * radius));
921 _Path.push_back(center);
927 _Path.reserve(_Path.Size + (num_segments + 1));
928 for (
int i = 0;
i <= num_segments;
i++)
930 const float a = a_min + ((float)
i / (
float)num_segments) * (a_max - a_min);
942 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);
946 static void PathBezierToCasteljau(
ImVector<ImVec2>*
path,
float x1,
float y1,
float x2,
float y2,
float x3,
float y3,
float x4,
float y4,
float tess_tol,
int level)
950 float d2 = ((x2 - x4) * dy - (y2 - y4) * dx);
951 float d3 = ((x3 - x4) * dy - (y3 - y4) * dx);
952 d2 = (d2 >= 0) ? d2 : -d2;
953 d3 = (d3 >= 0) ? d3 : -d3;
954 if ((d2+d3) * (d2+d3) < tess_tol * (dx*dx + dy*dy))
960 float x12 = (x1+x2)*0.5
f, y12 = (y1+y2)*0.5f;
961 float x23 = (x2+x3)*0.5
f, y23 = (y2+y3)*0.5f;
962 float x34 = (x3+x4)*0.5
f, y34 = (y3+y4)*0.5f;
963 float x123 = (x12+x23)*0.5
f, y123 = (y12+y23)*0.5f;
964 float x234 = (x23+x34)*0.5
f, y234 = (y23+y34)*0.5f;
965 float x1234 = (x123+x234)*0.5
f, y1234 = (y123+y234)*0.5f;
966 PathBezierToCasteljau(
path, x1,y1, x12,y12, x123,y123, x1234,y1234, tess_tol,
level+1);
967 PathBezierToCasteljau(
path, x1234,y1234, x234,y234, x34,y34, x4,y4, tess_tol,
level+1);
974 if (num_segments == 0)
976 PathBezierToCasteljau(&_Path, p1.
x, p1.
y, p2.
x, p2.
y, p3.
x, p3.
y, p4.
x, p4.
y, _Data->CurveTessellationTol, 0);
980 float t_step = 1.0f / (float)num_segments;
981 for (
int i_step = 1; i_step <= num_segments; i_step++)
982 _Path.push_back(
ImBezierCalc(p1, p2, p3, p4, t_step * i_step));
991 if (rounding <= 0.0
f || rounding_corners == 0)
1004 PathArcToFast(
ImVec2(
a.x + rounding_tl,
a.y + rounding_tl), rounding_tl, 6, 9);
1005 PathArcToFast(
ImVec2(
b.x - rounding_tr,
a.y + rounding_tr), rounding_tr, 9, 12);
1006 PathArcToFast(
ImVec2(
b.x - rounding_br,
b.y - rounding_br), rounding_br, 0, 3);
1007 PathArcToFast(
ImVec2(
a.x + rounding_bl,
b.y - rounding_bl), rounding_bl, 3, 6);
1015 PathLineTo(p1 +
ImVec2(0.5
f, 0.5
f));
1016 PathLineTo(p2 +
ImVec2(0.5
f, 0.5
f));
1017 PathStroke(col,
false, thickness);
1027 PathRect(p_min +
ImVec2(0.50
f,0.50
f), p_max -
ImVec2(0.50
f,0.50
f), rounding, rounding_corners);
1029 PathRect(p_min +
ImVec2(0.50
f,0.50
f), p_max -
ImVec2(0.49
f,0.49
f), rounding, rounding_corners);
1030 PathStroke(col,
true, thickness);
1037 if (rounding > 0.0
f)
1039 PathRect(p_min, p_max, rounding, rounding_corners);
1040 PathFillConvex(col);
1045 PrimRect(p_min, p_max, col);
1052 if (((col_upr_left | col_upr_right | col_bot_right | col_bot_left) &
IM_COL32_A_MASK) == 0)
1055 const ImVec2 uv = _Data->TexUvWhitePixel;
1057 PrimWriteIdx((
ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((
ImDrawIdx)(_VtxCurrentIdx+1)); PrimWriteIdx((
ImDrawIdx)(_VtxCurrentIdx+2));
1058 PrimWriteIdx((
ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((
ImDrawIdx)(_VtxCurrentIdx+2)); PrimWriteIdx((
ImDrawIdx)(_VtxCurrentIdx+3));
1059 PrimWriteVtx(p_min, uv, col_upr_left);
1060 PrimWriteVtx(
ImVec2(p_max.
x, p_min.
y), uv, col_upr_right);
1061 PrimWriteVtx(p_max, uv, col_bot_right);
1062 PrimWriteVtx(
ImVec2(p_min.
x, p_max.
y), uv, col_bot_left);
1074 PathStroke(col,
true, thickness);
1086 PathFillConvex(col);
1097 PathStroke(col,
true, thickness);
1108 PathFillConvex(col);
1117 if (num_segments <= 0)
1120 const int radius_idx = (int)radius - 1;
1121 if (radius_idx <
IM_ARRAYSIZE(_Data->CircleSegmentCounts))
1122 num_segments = _Data->CircleSegmentCounts[radius_idx];
1133 const float a_max = (
IM_PI * 2.0f) * ((
float)num_segments - 1.0f) / (
float)num_segments;
1134 if (num_segments == 12)
1135 PathArcToFast(center, radius - 0.5
f, 0, 12);
1137 PathArcTo(center, radius - 0.5
f, 0.0
f, a_max, num_segments - 1);
1138 PathStroke(col,
true, thickness);
1147 if (num_segments <= 0)
1150 const int radius_idx = (int)radius - 1;
1151 if (radius_idx <
IM_ARRAYSIZE(_Data->CircleSegmentCounts))
1152 num_segments = _Data->CircleSegmentCounts[radius_idx];
1163 const float a_max = (
IM_PI * 2.0f) * ((
float)num_segments - 1.0f) / (
float)num_segments;
1164 if (num_segments == 12)
1165 PathArcToFast(center, radius, 0, 12);
1167 PathArcTo(center, radius, 0.0
f, a_max, num_segments - 1);
1168 PathFillConvex(col);
1178 const float a_max = (
IM_PI * 2.0f) * ((
float)num_segments - 1.0f) / (
float)num_segments;
1179 PathArcTo(center, radius - 0.5
f, 0.0
f, a_max, num_segments - 1);
1180 PathStroke(col,
true, thickness);
1190 const float a_max = (
IM_PI * 2.0f) * ((
float)num_segments - 1.0f) / (
float)num_segments;
1191 PathArcTo(center, radius, 0.0
f, a_max, num_segments - 1);
1192 PathFillConvex(col);
1202 PathBezierCurveTo(p2, p3, p4, num_segments);
1203 PathStroke(col,
false, thickness);
1211 if (text_end ==
NULL)
1212 text_end = text_begin + strlen(text_begin);
1213 if (text_begin == text_end)
1219 if (font_size == 0.0
f)
1224 ImVec4 clip_rect = _ClipRectStack.back();
1225 if (cpu_fine_clip_rect)
1227 clip_rect.
x =
ImMax(clip_rect.
x, cpu_fine_clip_rect->
x);
1228 clip_rect.
y =
ImMax(clip_rect.
y, cpu_fine_clip_rect->
y);
1229 clip_rect.
z =
ImMin(clip_rect.
z, cpu_fine_clip_rect->
z);
1230 clip_rect.
w =
ImMin(clip_rect.
w, cpu_fine_clip_rect->
w);
1232 font->
RenderText(
this, font_size, pos, col, clip_rect, text_begin, text_end, wrap_width, cpu_fine_clip_rect !=
NULL);
1237 AddText(
NULL, 0.0
f, pos, col, text_begin, text_end);
1245 const bool push_texture_id = _TextureIdStack.empty() || user_texture_id != _TextureIdStack.back();
1246 if (push_texture_id)
1247 PushTextureID(user_texture_id);
1250 PrimRectUV(p_min, p_max, uv_min, uv_max, col);
1252 if (push_texture_id)
1261 const bool push_texture_id = _TextureIdStack.empty() || user_texture_id != _TextureIdStack.back();
1262 if (push_texture_id)
1263 PushTextureID(user_texture_id);
1266 PrimQuadUV(p1, p2, p3, p4, uv1, uv2, uv3, uv4, col);
1268 if (push_texture_id)
1279 AddImage(user_texture_id, p_min, p_max, uv_min, uv_max, col);
1283 const bool push_texture_id = _TextureIdStack.empty() || user_texture_id != _TextureIdStack.back();
1284 if (push_texture_id)
1285 PushTextureID(user_texture_id);
1287 int vert_start_idx = VtxBuffer.Size;
1288 PathRect(p_min, p_max, rounding, rounding_corners);
1289 PathFillConvex(col);
1290 int vert_end_idx = VtxBuffer.Size;
1293 if (push_texture_id)
1306 for (
int i = 0;
i < _Channels.Size;
i++)
1309 memset(&_Channels[
i], 0,
sizeof(_Channels[
i]));
1310 _Channels[
i]._CmdBuffer.clear();
1311 _Channels[
i]._IdxBuffer.clear();
1320 IM_ASSERT(_Current == 0 && _Count <= 1 &&
"Nested channel splitting is not supported. Please use separate instances of ImDrawListSplitter.");
1321 int old_channels_count = _Channels.Size;
1322 if (old_channels_count < channels_count)
1323 _Channels.resize(channels_count);
1324 _Count = channels_count;
1330 for (
int i = 1;
i < channels_count;
i++)
1332 if (
i >= old_channels_count)
1338 _Channels[
i]._CmdBuffer.resize(0);
1339 _Channels[
i]._IdxBuffer.resize(0);
1341 if (_Channels[
i]._CmdBuffer.Size == 0)
1346 _Channels[
i]._CmdBuffer.push_back(draw_cmd);
1353 return memcmp(&
a->ClipRect, &
b->ClipRect,
sizeof(
a->ClipRect)) == 0 &&
a->TextureId ==
b->TextureId &&
a->VtxOffset ==
b->VtxOffset && !
a->UserCallback && !
b->UserCallback;
1362 SetCurrentChannel(draw_list, 0);
1367 int new_cmd_buffer_count = 0;
1368 int new_idx_buffer_count = 0;
1371 for (
int i = 1;
i < _Count;
i++)
1374 if (
ch._CmdBuffer.Size > 0 &&
ch._CmdBuffer.back().ElemCount == 0)
1375 ch._CmdBuffer.pop_back();
1379 last_cmd->
ElemCount +=
ch._CmdBuffer[0].ElemCount;
1380 idx_offset +=
ch._CmdBuffer[0].ElemCount;
1381 ch._CmdBuffer.erase(
ch._CmdBuffer.Data);
1383 if (
ch._CmdBuffer.Size > 0)
1384 last_cmd = &
ch._CmdBuffer.back();
1385 new_cmd_buffer_count +=
ch._CmdBuffer.Size;
1386 new_idx_buffer_count +=
ch._IdxBuffer.Size;
1387 for (
int cmd_n = 0; cmd_n <
ch._CmdBuffer.Size; cmd_n++)
1389 ch._CmdBuffer.Data[cmd_n].IdxOffset = idx_offset;
1390 idx_offset +=
ch._CmdBuffer.Data[cmd_n].ElemCount;
1399 for (
int i = 1;
i < _Count;
i++)
1402 if (
int sz =
ch._CmdBuffer.Size) { memcpy(cmd_write,
ch._CmdBuffer.Data, sz *
sizeof(
ImDrawCmd)); cmd_write += sz; }
1403 if (
int sz =
ch._IdxBuffer.Size) { memcpy(idx_write,
ch._IdxBuffer.Data, sz *
sizeof(
ImDrawIdx)); idx_write += sz; }
1414 if (_Current ==
idx)
1417 memcpy(&_Channels.Data[_Current]._CmdBuffer, &draw_list->
CmdBuffer,
sizeof(draw_list->
CmdBuffer));
1418 memcpy(&_Channels.Data[_Current]._IdxBuffer, &draw_list->
IdxBuffer,
sizeof(draw_list->
IdxBuffer));
1433 TotalVtxCount = TotalIdxCount = 0;
1434 for (
int i = 0;
i < CmdListsCount;
i++)
1453 for (
int i = 0;
i < CmdListsCount;
i++)
1456 for (
int cmd_i = 0; cmd_i < cmd_list->
CmdBuffer.
Size; cmd_i++)
1471 ImVec2 gradient_extent = gradient_p1 - gradient_p0;
1472 float gradient_inv_length2 = 1.0f /
ImLengthSqr(gradient_extent);
1475 for (
ImDrawVert* vert = vert_start; vert < vert_end; vert++)
1477 float d =
ImDot(vert->pos - gradient_p0, gradient_extent);
1478 float t =
ImClamp(
d * gradient_inv_length2, 0.0
f, 1.0
f);
1490 const ImVec2 uv_size = uv_b - uv_a;
1492 size.x != 0.0f ? (uv_size.
x /
size.x) : 0.0f,
1493 size.y != 0.0f ? (uv_size.
y /
size.y) : 0.0f);
1501 for (
ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex)
1502 vertex->uv =
ImClamp(uv_a +
ImMul(
ImVec2(vertex->pos.x, vertex->pos.y) -
a, scale), min, max);
1506 for (
ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex)
1507 vertex->uv = uv_a +
ImMul(
ImVec2(vertex->pos.x, vertex->pos.y) -
a, scale);
1519 FontDataOwnedByAtlas =
true;
1525 GlyphExtraSpacing =
ImVec2(0.0
f, 0.0
f);
1528 GlyphMinAdvanceX = 0.0f;
1529 GlyphMaxAdvanceX = FLT_MAX;
1532 RasterizerMultiply = 1.0f;
1534 memset(Name, 0,
sizeof(Name));
1549 "..- -XXXXXXX- X - X -XXXXXXX - XXXXXXX- XX "
1550 "..- -X.....X- X.X - X.X -X.....X - X.....X- X..X "
1551 "--- -XXX.XXX- X...X - X...X -X....X - X....X- X..X "
1552 "X - X.X - X.....X - X.....X -X...X - X...X- X..X "
1553 "XX - X.X -X.......X- X.......X -X..X.X - X.X..X- X..X "
1554 "X.X - X.X -XXXX.XXXX- XXXX.XXXX -X.X X.X - X.X X.X- X..XXX "
1555 "X..X - X.X - X.X - X.X -XX X.X - X.X XX- X..X..XXX "
1556 "X...X - X.X - X.X - XX X.X XX - X.X - X.X - X..X..X..XX "
1557 "X....X - X.X - X.X - X.X X.X X.X - X.X - X.X - X..X..X..X.X "
1558 "X.....X - X.X - X.X - X..X X.X X..X - X.X - X.X -XXX X..X..X..X..X"
1559 "X......X - X.X - X.X - X...XXXXXX.XXXXXX...X - X.X XX-XX X.X -X..XX........X..X"
1560 "X.......X - X.X - X.X -X.....................X- X.X X.X-X.X X.X -X...X...........X"
1561 "X........X - X.X - X.X - X...XXXXXX.XXXXXX...X - X.X..X-X..X.X - X..............X"
1562 "X.........X -XXX.XXX- X.X - X..X X.X X..X - X...X-X...X - X.............X"
1563 "X..........X-X.....X- X.X - X.X X.X X.X - X....X-X....X - X.............X"
1564 "X......XXXXX-XXXXXXX- X.X - XX X.X XX - X.....X-X.....X - X............X"
1565 "X...X..X --------- X.X - X.X - XXXXXXX-XXXXXXX - X...........X "
1566 "X..X X..X - -XXXX.XXXX- XXXX.XXXX ------------------------------------- X..........X "
1567 "X.X X..X - -X.......X- X.......X - XX XX - - X..........X "
1568 "XX X..X - - X.....X - X.....X - X.X X.X - - X........X "
1569 " X..X - X...X - X...X - X..X X..X - - X........X "
1570 " XX - X.X - X.X - X...XXXXXXXXXXXXX...X - - XXXXXXXXXX "
1571 "------------ - X - X -X.....................X- ------------------"
1572 " ----------------------------------- X...XXXXXXXXXXXXX...X - "
1596 TexDesiredWidth = 0;
1597 TexGlyphPadding = 1;
1599 TexPixelsAlpha8 =
NULL;
1600 TexPixelsRGBA32 =
NULL;
1601 TexWidth = TexHeight = 0;
1603 TexUvWhitePixel =
ImVec2(0.0
f, 0.0
f);
1605 CustomRectIds[
n] = -1;
1610 IM_ASSERT(!Locked &&
"Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
1616 IM_ASSERT(!Locked &&
"Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
1617 for (
int i = 0;
i < ConfigData.Size;
i++)
1618 if (ConfigData[
i].FontData && ConfigData[
i].FontDataOwnedByAtlas)
1621 ConfigData[
i].FontData =
NULL;
1625 for (
int i = 0;
i < Fonts.Size;
i++)
1626 if (Fonts[
i]->ConfigData >= ConfigData.Data && Fonts[
i]->ConfigData < ConfigData.Data + ConfigData.Size)
1628 Fonts[
i]->ConfigData =
NULL;
1629 Fonts[
i]->ConfigDataCount = 0;
1632 CustomRects.clear();
1634 CustomRectIds[
n] = -1;
1639 IM_ASSERT(!Locked &&
"Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
1640 if (TexPixelsAlpha8)
1642 if (TexPixelsRGBA32)
1644 TexPixelsAlpha8 =
NULL;
1645 TexPixelsRGBA32 =
NULL;
1650 IM_ASSERT(!Locked &&
"Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
1651 for (
int i = 0;
i < Fonts.Size;
i++)
1666 if (TexPixelsAlpha8 ==
NULL)
1668 if (ConfigData.empty())
1673 *out_pixels = TexPixelsAlpha8;
1674 if (out_width) *out_width = TexWidth;
1675 if (out_height) *out_height = TexHeight;
1676 if (out_bytes_per_pixel) *out_bytes_per_pixel = 1;
1683 if (!TexPixelsRGBA32)
1689 TexPixelsRGBA32 = (
unsigned int*)
IM_ALLOC((
size_t)TexWidth * (size_t)TexHeight * 4);
1691 unsigned int*
dst = TexPixelsRGBA32;
1692 for (
int n = TexWidth * TexHeight;
n > 0;
n--)
1697 *out_pixels = (
unsigned char*)TexPixelsRGBA32;
1698 if (out_width) *out_width = TexWidth;
1699 if (out_height) *out_height = TexHeight;
1700 if (out_bytes_per_pixel) *out_bytes_per_pixel = 4;
1705 IM_ASSERT(!Locked &&
"Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
1713 IM_ASSERT(!Fonts.empty() &&
"Cannot use MergeMode for the first font");
1715 ConfigData.push_back(*font_cfg);
1718 new_font_cfg.
DstFont = Fonts.back();
1738 static unsigned int Decode85Byte(
char c) {
return c >=
'\\' ? c-36 : c-35; }
1744 dst[0] = ((tmp >> 0) & 0xFF);
dst[1] = ((tmp >> 8) & 0xFF);
dst[2] = ((tmp >> 16) & 0xFF);
dst[3] = ((tmp >> 24) & 0xFF);
1754 if (!font_cfg_template)
1761 if (font_cfg.
Name[0] ==
'\0')
1767 ImFont* font = AddFontFromMemoryCompressedBase85TTF(ttf_compressed_base85, font_cfg.
SizePixels, &font_cfg, glyph_ranges);
1774 IM_ASSERT(!Locked &&
"Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
1775 size_t data_size = 0;
1783 if (font_cfg.
Name[0] ==
'\0')
1787 for (
p = filename + strlen(filename);
p > filename &&
p[-1] !=
'/' &&
p[-1] !=
'\\';
p--) {}
1790 return AddFontFromMemoryTTF(
data, (
int)data_size, size_pixels, &font_cfg, glyph_ranges);
1796 IM_ASSERT(!Locked &&
"Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
1804 return AddFont(&font_cfg);
1809 const unsigned int buf_decompressed_size =
stb_decompress_length((
const unsigned char*)compressed_ttf_data);
1810 unsigned char* buf_decompressed_data = (
unsigned char *)
IM_ALLOC(buf_decompressed_size);
1811 stb_decompress(buf_decompressed_data, (
const unsigned char*)compressed_ttf_data, (
unsigned int)compressed_ttf_size);
1816 return AddFontFromMemoryTTF(buf_decompressed_data, (
int)buf_decompressed_size, size_pixels, &font_cfg, glyph_ranges);
1821 int compressed_ttf_size = (((int)strlen(compressed_ttf_data_base85) + 4) / 5) * 4;
1822 void* compressed_ttf =
IM_ALLOC((
size_t)compressed_ttf_size);
1823 Decode85((
const unsigned char*)compressed_ttf_data_base85, (
unsigned char*)compressed_ttf);
1824 ImFont* font = AddFontFromMemoryCompressedTTF(compressed_ttf, compressed_ttf_size, size_pixels, font_cfg, glyph_ranges);
1837 r.Width = (
unsigned short)
width;
1838 r.Height = (
unsigned short)
height;
1839 CustomRects.push_back(
r);
1840 return CustomRects.Size - 1;
1850 r.Width = (
unsigned short)
width;
1851 r.Height = (
unsigned short)
height;
1852 r.GlyphAdvanceX = advance_x;
1855 CustomRects.push_back(
r);
1856 return CustomRects.Size - 1;
1861 IM_ASSERT(TexWidth > 0 && TexHeight > 0);
1863 *out_uv_min =
ImVec2((
float)rect->
X * TexUvScale.x, (
float)rect->
Y * TexUvScale.y);
1864 *out_uv_max =
ImVec2((
float)(rect->
X + rect->
Width) * TexUvScale.x, (
float)(rect->
Y + rect->
Height) * TexUvScale.y);
1881 out_uv_border[0] = (pos) * TexUvScale;
1882 out_uv_border[1] = (pos +
size) * TexUvScale;
1884 out_uv_fill[0] = (pos) * TexUvScale;
1885 out_uv_fill[1] = (pos +
size) * TexUvScale;
1891 IM_ASSERT(!Locked &&
"Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
1897 for (
unsigned int i = 0;
i < 256;
i++)
1899 unsigned int value = (
unsigned int)(
i * in_brighten_factor);
1900 out_table[
i] =
value > 255 ? 255 : (
value & 0xFF);
1908 for (
int i = 0;
i <
w;
i++)
1942 for (
const ImU32*
it = it_begin;
it < it_end;
it++)
1944 for (
ImU32 bit_n = 0; bit_n < 32; bit_n++)
1945 if (entries_32 & ((
ImU32)1 << bit_n))
1946 out->
push_back((
int)(((
it - it_begin) << 5) + bit_n));
1979 for (
int output_i = 0; output_i < atlas->
Fonts.
Size && src_tmp.
DstIndex == -1; output_i++)
1988 IM_ASSERT(font_offset >= 0 &&
"FontData is incorrect, or FontNo cannot be found.");
1995 for (
const ImWchar* src_range = src_tmp.
SrcRanges; src_range[0] && src_range[1]; src_range += 2)
2002 int total_glyphs_count = 0;
2003 for (
int src_i = 0; src_i < src_tmp_array.
Size; src_i++)
2011 for (
const ImWchar* src_range = src_tmp.
SrcRanges; src_range[0] && src_range[1]; src_range += 2)
2012 for (
unsigned int codepoint = src_range[0]; codepoint <= src_range[1]; codepoint++)
2024 total_glyphs_count++;
2029 for (
int src_i = 0; src_i < src_tmp_array.
Size; src_i++)
2037 for (
int dst_i = 0; dst_i < dst_tmp_array.
Size; dst_i++)
2038 dst_tmp_array[dst_i].GlyphsSet.Clear();
2039 dst_tmp_array.
clear();
2045 buf_rects.
resize(total_glyphs_count);
2046 buf_packedchars.
resize(total_glyphs_count);
2051 int total_surface = 0;
2052 int buf_rects_out_n = 0;
2053 int buf_packedchars_out_n = 0;
2054 for (
int src_i = 0; src_i < src_tmp_array.
Size; src_i++)
2060 src_tmp.
Rects = &buf_rects[buf_rects_out_n];
2061 src_tmp.
PackedChars = &buf_packedchars[buf_packedchars_out_n];
2078 for (
int glyph_i = 0; glyph_i < src_tmp.
GlyphsList.
Size; glyph_i++)
2086 total_surface += src_tmp.
Rects[glyph_i].
w * src_tmp.
Rects[glyph_i].
h;
2093 const int surface_sqrt = (int)
ImSqrt((
float)total_surface) + 1;
2098 atlas->
TexWidth = (surface_sqrt >= 4096*0.7f) ? 4096 : (surface_sqrt >= 2048*0.7
f) ? 2048 : (surface_sqrt >= 1024*0.7f) ? 1024 : 512;
2102 const int TEX_HEIGHT_MAX = 1024 * 32;
2108 for (
int src_i = 0; src_i < src_tmp_array.
Size; src_i++)
2118 for (
int glyph_i = 0; glyph_i < src_tmp.
GlyphsCount; glyph_i++)
2132 for (
int src_i = 0; src_i < src_tmp_array.
Size; src_i++)
2144 unsigned char multiply_table[256];
2147 for (
int glyph_i = 0; glyph_i < src_tmp.
GlyphsCount; glyph_i++,
r++)
2159 for (
int src_i = 0; src_i < src_tmp_array.
Size; src_i++)
2169 int unscaled_ascent, unscaled_descent, unscaled_line_gap;
2172 const float ascent =
ImFloor(unscaled_ascent * font_scale + ((unscaled_ascent > 0.0
f) ? +1 : -1));
2173 const float descent =
ImFloor(unscaled_descent * font_scale + ((unscaled_descent > 0.0
f) ? +1 : -1));
2178 for (
int glyph_i = 0; glyph_i < src_tmp.
GlyphsCount; glyph_i++)
2180 const int codepoint = src_tmp.
GlyphsList[glyph_i];
2183 const float char_advance_x_org = pc.
xadvance;
2185 float char_off_x = font_off_x;
2186 if (char_advance_x_org != char_advance_x_mod)
2187 char_off_x += cfg.
PixelSnapH ?
ImFloor((char_advance_x_mod - char_advance_x_org) * 0.5
f) : (char_advance_x_mod - char_advance_x_org) * 0.5
f;
2191 float dummy_x = 0.0f, dummy_y = 0.0f;
2193 dst_font->
AddGlyph((
ImWchar)codepoint, q.
x0 + char_off_x, q.
y0 + font_off_y, q.
x1 + char_off_x, q.
y1 + font_off_y, q.
s0, q.
t0, q.
s1, q.
t1, char_advance_x_mod);
2198 for (
int src_i = 0; src_i < src_tmp_array.
Size; src_i++)
2241 for (
int i = 0;
i < user_rects.
Size;
i++)
2243 pack_rects[
i].w = user_rects[
i].Width;
2244 pack_rects[
i].h = user_rects[
i].Height;
2247 for (
int i = 0;
i < pack_rects.
Size;
i++)
2248 if (pack_rects[
i].was_packed)
2250 user_rects[
i].X = pack_rects[
i].x;
2251 user_rects[
i].Y = pack_rects[
i].y;
2252 IM_ASSERT(pack_rects[
i].
w == user_rects[
i].Width && pack_rects[
i].
h == user_rects[
i].Height);
2273 const int offset0 = (int)(
r.X +
x) + (int)(
r.Y +
y) *
w;
2282 const int offset = (int)(
r.X) + (int)(
r.Y) *
w;
2297 if (
r.Font ==
NULL ||
r.ID >= 0x110000)
2303 r.Font->AddGlyph((
ImWchar)
r.ID,
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);
2308 if (atlas->
Fonts[
i]->DirtyLookupTables)
2309 atlas->
Fonts[
i]->BuildLookupTable();
2320 for (
int j = 0; j <
IM_ARRAYSIZE(ellipsis_variants); j++)
2332 static const ImWchar ranges[] =
2342 static const ImWchar ranges[] =
2354 static const ImWchar ranges[] =
2369 for (
int n = 0;
n < accumulative_offsets_count;
n++, out_ranges += 2)
2371 out_ranges[0] = out_ranges[1] = (
ImWchar)(base_codepoint + accumulative_offsets[
n]);
2372 base_codepoint += accumulative_offsets[
n];
2388 static const short accumulative_offsets_from_0x4E00[] =
2390 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,
2391 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,
2392 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,
2393 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,
2394 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,
2395 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,
2396 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,
2397 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,
2398 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,
2399 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,
2400 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,
2401 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,
2402 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,
2403 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,
2404 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,
2405 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,
2406 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,
2407 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,
2408 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,
2409 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,
2410 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,
2411 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,
2412 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,
2413 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,
2414 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,
2415 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,
2416 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,
2417 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,
2418 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,
2419 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,
2420 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,
2421 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,
2422 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,
2423 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,
2424 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,
2425 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,
2426 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,
2427 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,
2428 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,
2429 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
2431 static ImWchar base_ranges[] =
2440 if (!full_ranges[0])
2442 memcpy(full_ranges, base_ranges,
sizeof(base_ranges));
2445 return &full_ranges[0];
2455 static const short accumulative_offsets_from_0x4E00[] =
2457 0,1,2,4,1,1,1,1,2,1,6,2,2,1,8,5,7,11,1,2,10,10,8,2,4,20,2,11,8,2,1,2,1,6,2,1,7,5,3,7,1,1,13,7,9,1,4,6,1,2,1,10,1,1,9,2,2,4,5,6,14,1,1,9,3,18,
2458 5,4,2,2,10,7,1,1,1,3,2,4,3,23,2,10,12,2,14,2,4,13,1,6,10,3,1,7,13,6,4,13,5,2,3,17,2,2,5,7,6,4,1,7,14,16,6,13,9,15,1,1,7,16,4,7,1,19,9,2,7,15,
2459 2,6,5,13,25,4,14,13,11,25,1,1,1,2,1,2,2,3,10,11,3,3,1,1,4,4,2,1,4,9,1,4,3,5,5,2,7,12,11,15,7,16,4,5,16,2,1,1,6,3,3,1,1,2,7,6,6,7,1,4,7,6,1,1,
2460 2,1,12,3,3,9,5,8,1,11,1,2,3,18,20,4,1,3,6,1,7,3,5,5,7,2,2,12,3,1,4,2,3,2,3,11,8,7,4,17,1,9,25,1,1,4,2,2,4,1,2,7,1,1,1,3,1,2,6,16,1,2,1,1,3,12,
2461 20,2,5,20,8,7,6,2,1,1,1,1,6,2,1,2,10,1,1,6,1,3,1,2,1,4,1,12,4,1,3,1,1,1,1,1,10,4,7,5,13,1,15,1,1,30,11,9,1,15,38,14,1,32,17,20,1,9,31,2,21,9,
2462 4,49,22,2,1,13,1,11,45,35,43,55,12,19,83,1,3,2,3,13,2,1,7,3,18,3,13,8,1,8,18,5,3,7,25,24,9,24,40,3,17,24,2,1,6,2,3,16,15,6,7,3,12,1,9,7,3,3,
2463 3,15,21,5,16,4,5,12,11,11,3,6,3,2,31,3,2,1,1,23,6,6,1,4,2,6,5,2,1,1,3,3,22,2,6,2,3,17,3,2,4,5,1,9,5,1,1,6,15,12,3,17,2,14,2,8,1,23,16,4,2,23,
2464 8,15,23,20,12,25,19,47,11,21,65,46,4,3,1,5,6,1,2,5,26,2,1,1,3,11,1,1,1,2,1,2,3,1,1,10,2,3,1,1,1,3,6,3,2,2,6,6,9,2,2,2,6,2,5,10,2,4,1,2,1,2,2,
2465 3,1,1,3,1,2,9,23,9,2,1,1,1,1,5,3,2,1,10,9,6,1,10,2,31,25,3,7,5,40,1,15,6,17,7,27,180,1,3,2,2,1,1,1,6,3,10,7,1,3,6,17,8,6,2,2,1,3,5,5,8,16,14,
2466 15,1,1,4,1,2,1,1,1,3,2,7,5,6,2,5,10,1,4,2,9,1,1,11,6,1,44,1,3,7,9,5,1,3,1,1,10,7,1,10,4,2,7,21,15,7,2,5,1,8,3,4,1,3,1,6,1,4,2,1,4,10,8,1,4,5,
2467 1,5,10,2,7,1,10,1,1,3,4,11,10,29,4,7,3,5,2,3,33,5,2,19,3,1,4,2,6,31,11,1,3,3,3,1,8,10,9,12,11,12,8,3,14,8,6,11,1,4,41,3,1,2,7,13,1,5,6,2,6,12,
2468 12,22,5,9,4,8,9,9,34,6,24,1,1,20,9,9,3,4,1,7,2,2,2,6,2,28,5,3,6,1,4,6,7,4,2,1,4,2,13,6,4,4,3,1,8,8,3,2,1,5,1,2,2,3,1,11,11,7,3,6,10,8,6,16,16,
2469 22,7,12,6,21,5,4,6,6,3,6,1,3,2,1,2,8,29,1,10,1,6,13,6,6,19,31,1,13,4,4,22,17,26,33,10,4,15,12,25,6,67,10,2,3,1,6,10,2,6,2,9,1,9,4,4,1,2,16,2,
2470 5,9,2,3,8,1,8,3,9,4,8,6,4,8,11,3,2,1,1,3,26,1,7,5,1,11,1,5,3,5,2,13,6,39,5,1,5,2,11,6,10,5,1,15,5,3,6,19,21,22,2,4,1,6,1,8,1,4,8,2,4,2,2,9,2,
2471 1,1,1,4,3,6,3,12,7,1,14,2,4,10,2,13,1,17,7,3,2,1,3,2,13,7,14,12,3,1,29,2,8,9,15,14,9,14,1,3,1,6,5,9,11,3,38,43,20,7,7,8,5,15,12,19,15,81,8,7,
2472 1,5,73,13,37,28,8,8,1,15,18,20,165,28,1,6,11,8,4,14,7,15,1,3,3,6,4,1,7,14,1,1,11,30,1,5,1,4,14,1,4,2,7,52,2,6,29,3,1,9,1,21,3,5,1,26,3,11,14,
2473 11,1,17,5,1,2,1,3,2,8,1,2,9,12,1,1,2,3,8,3,24,12,7,7,5,17,3,3,3,1,23,10,4,4,6,3,1,16,17,22,3,10,21,16,16,6,4,10,2,1,1,2,8,8,6,5,3,3,3,39,25,
2474 15,1,1,16,6,7,25,15,6,6,12,1,22,13,1,4,9,5,12,2,9,1,12,28,8,3,5,10,22,60,1,2,40,4,61,63,4,1,13,12,1,4,31,12,1,14,89,5,16,6,29,14,2,5,49,18,18,
2475 5,29,33,47,1,17,1,19,12,2,9,7,39,12,3,7,12,39,3,1,46,4,12,3,8,9,5,31,15,18,3,2,2,66,19,13,17,5,3,46,124,13,57,34,2,5,4,5,8,1,1,1,4,3,1,17,5,
2476 3,5,3,1,8,5,6,3,27,3,26,7,12,7,2,17,3,7,18,78,16,4,36,1,2,1,6,2,1,39,17,7,4,13,4,4,4,1,10,4,2,4,6,3,10,1,19,1,26,2,4,33,2,73,47,7,3,8,2,4,15,
2477 18,1,29,2,41,14,1,21,16,41,7,39,25,13,44,2,2,10,1,13,7,1,7,3,5,20,4,8,2,49,1,10,6,1,6,7,10,7,11,16,3,12,20,4,10,3,1,2,11,2,28,9,2,4,7,2,15,1,
2478 27,1,28,17,4,5,10,7,3,24,10,11,6,26,3,2,7,2,2,49,16,10,16,15,4,5,27,61,30,14,38,22,2,7,5,1,3,12,23,24,17,17,3,3,2,4,1,6,2,7,5,1,1,5,1,1,9,4,
2479 1,3,6,1,8,2,8,4,14,3,5,11,4,1,3,32,1,19,4,1,13,11,5,2,1,8,6,8,1,6,5,13,3,23,11,5,3,16,3,9,10,1,24,3,198,52,4,2,2,5,14,5,4,22,5,20,4,11,6,41,
2480 1,5,2,2,11,5,2,28,35,8,22,3,18,3,10,7,5,3,4,1,5,3,8,9,3,6,2,16,22,4,5,5,3,3,18,23,2,6,23,5,27,8,1,33,2,12,43,16,5,2,3,6,1,20,4,2,9,7,1,11,2,
2481 10,3,14,31,9,3,25,18,20,2,5,5,26,14,1,11,17,12,40,19,9,6,31,83,2,7,9,19,78,12,14,21,76,12,113,79,34,4,1,1,61,18,85,10,2,2,13,31,11,50,6,33,159,
2482 179,6,6,7,4,4,2,4,2,5,8,7,20,32,22,1,3,10,6,7,28,5,10,9,2,77,19,13,2,5,1,4,4,7,4,13,3,9,31,17,3,26,2,6,6,5,4,1,7,11,3,4,2,1,6,2,20,4,1,9,2,6,
2483 3,7,1,1,1,20,2,3,1,6,2,3,6,2,4,8,1,5,13,8,4,11,23,1,10,6,2,1,3,21,2,2,4,24,31,4,10,10,2,5,192,15,4,16,7,9,51,1,2,1,1,5,1,1,2,1,3,5,3,1,3,4,1,
2484 3,1,3,3,9,8,1,2,2,2,4,4,18,12,92,2,10,4,3,14,5,25,16,42,4,14,4,2,21,5,126,30,31,2,1,5,13,3,22,5,6,6,20,12,1,14,12,87,3,19,1,8,2,9,9,3,3,23,2,
2485 3,7,6,3,1,2,3,9,1,3,1,6,3,2,1,3,11,3,1,6,10,3,2,3,1,2,1,5,1,1,11,3,6,4,1,7,2,1,2,5,5,34,4,14,18,4,19,7,5,8,2,6,79,1,5,2,14,8,2,9,2,1,36,28,16,
2486 4,1,1,1,2,12,6,42,39,16,23,7,15,15,3,2,12,7,21,64,6,9,28,8,12,3,3,41,59,24,51,55,57,294,9,9,2,6,2,15,1,2,13,38,90,9,9,9,3,11,7,1,1,1,5,6,3,2,
2487 1,2,2,3,8,1,4,4,1,5,7,1,4,3,20,4,9,1,1,1,5,5,17,1,5,2,6,2,4,1,4,5,7,3,18,11,11,32,7,5,4,7,11,127,8,4,3,3,1,10,1,1,6,21,14,1,16,1,7,1,3,6,9,65,
2488 51,4,3,13,3,10,1,1,12,9,21,110,3,19,24,1,1,10,62,4,1,29,42,78,28,20,18,82,6,3,15,6,84,58,253,15,155,264,15,21,9,14,7,58,40,39,
2490 static ImWchar base_ranges[] =
2498 if (!full_ranges[0])
2500 memcpy(full_ranges, base_ranges,
sizeof(base_ranges));
2503 return &full_ranges[0];
2508 static const ImWchar ranges[] =
2521 static const ImWchar ranges[] =
2533 static const ImWchar ranges[] =
2554 while (text_end ? (text < text_end) : *text)
2567 for (; ranges[0]; ranges += 2)
2568 for (
ImWchar c = ranges[0]; c <= ranges[1]; c++)
2575 for (
int n = 0;
n <= max_codepoint;
n++)
2579 while (
n < max_codepoint && GetBit(
n + 1))
2593 FallbackAdvanceX = 0.0f;
2596 DisplayOffset =
ImVec2(0.0
f, 0.0
f);
2597 FallbackGlyph =
NULL;
2598 ContainerAtlas =
NULL;
2600 ConfigDataCount = 0;
2601 DirtyLookupTables =
false;
2603 Ascent = Descent = 0.0f;
2604 MetricsTotalSurface = 0;
2605 memset(Used4kPagesMap, 0,
sizeof(Used4kPagesMap));
2616 FallbackAdvanceX = 0.0f;
2618 IndexAdvanceX.clear();
2619 IndexLookup.clear();
2620 FallbackGlyph =
NULL;
2621 ContainerAtlas =
NULL;
2622 DirtyLookupTables =
true;
2623 Ascent = Descent = 0.0f;
2624 MetricsTotalSurface = 0;
2629 int max_codepoint = 0;
2630 for (
int i = 0;
i != Glyphs.Size;
i++)
2631 max_codepoint =
ImMax(max_codepoint, (
int)Glyphs[
i].Codepoint);
2635 IndexAdvanceX.clear();
2636 IndexLookup.clear();
2637 DirtyLookupTables =
false;
2638 memset(Used4kPagesMap, 0,
sizeof(Used4kPagesMap));
2639 GrowIndex(max_codepoint + 1);
2640 for (
int i = 0;
i < Glyphs.Size;
i++)
2642 int codepoint = (int)Glyphs[
i].Codepoint;
2643 IndexAdvanceX[codepoint] = Glyphs[
i].AdvanceX;
2644 IndexLookup[codepoint] = (
ImWchar)
i;
2647 const int page_n = codepoint / 4096;
2648 Used4kPagesMap[page_n >> 3] |= 1 << (page_n & 7);
2655 if (Glyphs.back().Codepoint !=
'\t')
2656 Glyphs.resize(Glyphs.Size + 1);
2658 tab_glyph = *FindGlyph((
ImWchar)
' ');
2666 SetGlyphVisible((
ImWchar)
' ',
false);
2667 SetGlyphVisible((
ImWchar)
'\t',
false);
2670 FallbackGlyph = FindGlyphNoFallback(FallbackChar);
2671 FallbackAdvanceX = FallbackGlyph ? FallbackGlyph->AdvanceX : 0.0f;
2672 for (
int i = 0;
i < max_codepoint + 1;
i++)
2673 if (IndexAdvanceX[
i] < 0.0
f)
2674 IndexAdvanceX[
i] = FallbackAdvanceX;
2681 unsigned int page_begin = (c_begin / 4096);
2682 unsigned int page_last = (c_last / 4096);
2683 for (
unsigned int page_n = page_begin; page_n <= page_last; page_n++)
2684 if ((page_n >> 3) <
sizeof(Used4kPagesMap))
2685 if (Used4kPagesMap[page_n >> 3] & (1 << (page_n & 7)))
2693 glyph->Visible = visible ? 1 : 0;
2704 IM_ASSERT(IndexAdvanceX.Size == IndexLookup.Size);
2705 if (new_size <= IndexLookup.Size)
2707 IndexAdvanceX.resize(new_size, -1.0
f);
2708 IndexLookup.resize(new_size, (
ImWchar)-1);
2715 Glyphs.resize(Glyphs.Size + 1);
2717 glyph.
Codepoint = (
unsigned int)codepoint;
2718 glyph.
Visible = (x0 != x1) && (y0 != y1);
2727 glyph.
AdvanceX = advance_x + ConfigData->GlyphExtraSpacing.x;
2729 if (ConfigData->PixelSnapH)
2733 DirtyLookupTables =
true;
2734 MetricsTotalSurface += (int)((glyph.
U1 - glyph.
U0) * ContainerAtlas->TexWidth + 1.99f) * (
int)((glyph.
V1 - glyph.
V0) * ContainerAtlas->TexHeight + 1.99f);
2740 unsigned int index_size = (
unsigned int)IndexLookup.Size;
2742 if (
dst < index_size && IndexLookup.Data[
dst] == (
ImWchar)-1 && !overwrite_dst)
2744 if (
src >= index_size &&
dst >= index_size)
2748 IndexLookup[
dst] = (
src < index_size) ? IndexLookup.Data[
src] : (
ImWchar)-1;
2749 IndexAdvanceX[
dst] = (
src < index_size) ? IndexAdvanceX.Data[
src] : 1.0f;
2754 if (c >= (
size_t)IndexLookup.Size)
2755 return FallbackGlyph;
2756 const ImWchar i = IndexLookup.Data[c];
2758 return FallbackGlyph;
2759 return &Glyphs.Data[
i];
2764 if (c >= (
size_t)IndexLookup.Size)
2766 const ImWchar i = IndexLookup.Data[c];
2769 return &Glyphs.Data[
i];
2789 float line_width = 0.0f;
2790 float word_width = 0.0f;
2791 float blank_width = 0.0f;
2792 wrap_width /= scale;
2794 const char* word_end = text;
2795 const char* prev_word_end =
NULL;
2796 bool inside_word =
true;
2798 const char*
s = text;
2799 while (
s < text_end)
2801 unsigned int c = (
unsigned int)*
s;
2814 line_width = word_width = blank_width = 0.0f;
2826 const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX.Data[c] : FallbackAdvanceX);
2831 line_width += blank_width;
2835 blank_width += char_width;
2836 inside_word =
false;
2840 word_width += char_width;
2847 prev_word_end = word_end;
2848 line_width += word_width + blank_width;
2849 word_width = blank_width = 0.0f;
2853 inside_word = !(c ==
'.' || c ==
',' || c ==
';' || c ==
'!' || c ==
'?' || c ==
'\"');
2857 if (line_width + word_width > wrap_width)
2860 if (word_width < wrap_width)
2861 s = prev_word_end ? prev_word_end : word_end;
2874 text_end = text_begin + strlen(text_begin);
2876 const float line_height =
size;
2877 const float scale =
size / FontSize;
2880 float line_width = 0.0f;
2882 const bool word_wrap_enabled = (wrap_width > 0.0f);
2883 const char* word_wrap_eol =
NULL;
2885 const char*
s = text_begin;
2886 while (
s < text_end)
2888 if (word_wrap_enabled)
2893 word_wrap_eol = CalcWordWrapPositionA(scale,
s, text_end, wrap_width - line_width);
2894 if (word_wrap_eol ==
s)
2898 if (
s >= word_wrap_eol)
2900 if (text_size.
x < line_width)
2901 text_size.
x = line_width;
2902 text_size.
y += line_height;
2904 word_wrap_eol =
NULL;
2907 while (
s < text_end)
2910 if (
ImCharIsBlankA(c)) {
s++; }
else if (c ==
'\n') {
s++;
break; }
else {
break; }
2917 const char* prev_s =
s;
2918 unsigned int c = (
unsigned int)*
s;
2934 text_size.
x =
ImMax(text_size.
x, line_width);
2935 text_size.
y += line_height;
2943 const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX.Data[c] : FallbackAdvanceX) * scale;
2944 if (line_width + char_width >= max_width)
2950 line_width += char_width;
2953 if (text_size.
x < line_width)
2954 text_size.
x = line_width;
2956 if (line_width > 0 || text_size.
y == 0.0f)
2957 text_size.
y += line_height;
2968 if (!glyph || !glyph->
Visible)
2970 float scale = (
size >= 0.0f) ? (
size / FontSize) : 1.0f;
2980 text_end = text_begin + strlen(text_begin);
2987 if (
y > clip_rect.
w)
2990 const float scale =
size / FontSize;
2991 const float line_height = FontSize * scale;
2992 const bool word_wrap_enabled = (wrap_width > 0.0f);
2993 const char* word_wrap_eol =
NULL;
2996 const char*
s = text_begin;
2997 if (
y + line_height < clip_rect.
y && !word_wrap_enabled)
2998 while (
y + line_height < clip_rect.
y &&
s < text_end)
3000 s = (
const char*)memchr(
s,
'\n', text_end -
s);
3001 s =
s ?
s + 1 : text_end;
3007 if (text_end -
s > 10000 && !word_wrap_enabled)
3009 const char* s_end =
s;
3011 while (y_end < clip_rect.
w && s_end < text_end)
3013 s_end = (
const char*)memchr(s_end,
'\n', text_end - s_end);
3014 s_end = s_end ? s_end + 1 : text_end;
3015 y_end += line_height;
3023 const int vtx_count_max = (int)(text_end -
s) * 4;
3024 const int idx_count_max = (int)(text_end -
s) * 6;
3025 const int idx_expected_size = draw_list->
IdxBuffer.
Size + idx_count_max;
3026 draw_list->
PrimReserve(idx_count_max, vtx_count_max);
3032 while (
s < text_end)
3034 if (word_wrap_enabled)
3039 word_wrap_eol = CalcWordWrapPositionA(scale,
s, text_end, wrap_width - (
x - pos.
x));
3040 if (word_wrap_eol ==
s)
3044 if (
s >= word_wrap_eol)
3048 word_wrap_eol =
NULL;
3051 while (
s < text_end)
3054 if (
ImCharIsBlankA(c)) {
s++; }
else if (c ==
'\n') {
s++;
break; }
else {
break; }
3061 unsigned int c = (
unsigned int)*
s;
3079 if (
y > clip_rect.
w)
3091 float char_width = glyph->
AdvanceX * scale;
3095 float x1 =
x + glyph->
X0 * scale;
3096 float x2 =
x + glyph->
X1 * scale;
3097 float y1 =
y + glyph->
Y0 * scale;
3098 float y2 =
y + glyph->
Y1 * scale;
3099 if (x1 <= clip_rect.z && x2 >= clip_rect.
x)
3102 float u1 = glyph->
U0;
3103 float v1 = glyph->
V0;
3104 float u2 = glyph->
U1;
3105 float v2 = glyph->
V1;
3110 if (x1 < clip_rect.
x)
3112 u1 = u1 + (1.0f - (x2 - clip_rect.
x) / (x2 - x1)) * (u2 - u1);
3115 if (y1 < clip_rect.
y)
3117 v1 =
v1 + (1.0f - (y2 - clip_rect.
y) / (y2 - y1)) * (
v2 -
v1);
3120 if (x2 > clip_rect.
z)
3122 u2 = u1 + ((clip_rect.
z - x1) / (x2 - x1)) * (u2 - u1);
3125 if (y2 > clip_rect.
w)
3127 v2 =
v1 + ((clip_rect.
w - y1) / (y2 - y1)) * (
v2 -
v1);
3139 idx_write[0] = (
ImDrawIdx)(vtx_current_idx); idx_write[1] = (
ImDrawIdx)(vtx_current_idx+1); idx_write[2] = (
ImDrawIdx)(vtx_current_idx+2);
3140 idx_write[3] = (
ImDrawIdx)(vtx_current_idx); idx_write[4] = (
ImDrawIdx)(vtx_current_idx+2); idx_write[5] = (
ImDrawIdx)(vtx_current_idx+3);
3141 vtx_write[0].
pos.
x = x1; vtx_write[0].
pos.
y = y1; vtx_write[0].
col = col; vtx_write[0].
uv.
x = u1; vtx_write[0].
uv.
y =
v1;
3142 vtx_write[1].
pos.
x = x2; vtx_write[1].
pos.
y = y1; vtx_write[1].
col = col; vtx_write[1].
uv.
x = u2; vtx_write[1].
uv.
y =
v1;
3143 vtx_write[2].
pos.
x = x2; vtx_write[2].
pos.
y = y2; vtx_write[2].
col = col; vtx_write[2].
uv.
x = u2; vtx_write[2].
uv.
y =
v2;
3144 vtx_write[3].
pos.
x = x1; vtx_write[3].
pos.
y = y2; vtx_write[3].
col = col; vtx_write[3].
uv.
x = u1; vtx_write[3].
uv.
y =
v2;
3146 vtx_current_idx += 4;
3182 float r =
h * 0.40f * scale;
3217 float thickness =
ImMax(sz / 5.0
f, 1.0
f);
3218 sz -= thickness * 0.5f;
3219 pos +=
ImVec2(thickness * 0.25
f, thickness * 0.25
f);
3221 float third = sz / 3.0f;
3222 float bx = pos.
x + third;
3223 float by = pos.
y + sz - third * 0.5f;
3227 draw_list->
PathStroke(col,
false, thickness);
3243 draw_list->
AddImage(tex_id, pos +
ImVec2(1,0)*scale, pos +
ImVec2(1,0)*scale +
size*scale, uv[2], uv[3], col_shadow);
3244 draw_list->
AddImage(tex_id, pos +
ImVec2(2,0)*scale, pos +
ImVec2(2,0)*scale +
size*scale, uv[2], uv[3], col_shadow);
3245 draw_list->
AddImage(tex_id, pos, pos +
size*scale, uv[2], uv[3], col_border);
3246 draw_list->
AddImage(tex_id, pos, pos +
size*scale, uv[0], uv[1], col_fill);
3266 if (
x <= 0.0
f)
return IM_PI * 0.5f;
3267 if (
x >= 1.0
f)
return 0.0f;
3275 if (x_end_norm == x_start_norm)
3277 if (x_start_norm > x_end_norm)
3278 ImSwap(x_start_norm, x_end_norm);
3282 if (rounding == 0.0
f)
3289 const float inv_rounding = 1.0f / rounding;
3290 const float arc0_b =
ImAcos01(1.0
f - (p0.
x - rect.
Min.
x) * inv_rounding);
3291 const float arc0_e =
ImAcos01(1.0
f - (p1.
x - rect.
Min.
x) * inv_rounding);
3292 const float half_pi =
IM_PI * 0.5f;
3293 const float x0 =
ImMax(p0.
x, rect.
Min.
x + rounding);
3294 if (arc0_b == arc0_e)
3299 else if (arc0_b == 0.0
f && arc0_e == half_pi)
3309 if (p1.
x > rect.
Min.
x + rounding)
3311 const float arc1_b =
ImAcos01(1.0
f - (rect.
Max.
x - p1.
x) * inv_rounding);
3312 const float arc1_e =
ImAcos01(1.0
f - (rect.
Max.
x - p0.
x) * inv_rounding);
3313 const float x1 =
ImMin(p1.
x, rect.
Max.
x - rounding);
3314 if (arc1_b == arc1_e)
3319 else if (arc1_b == 0.0
f && arc1_e == half_pi)
3326 draw_list->
PathArcTo(
ImVec2(x1, p0.
y + rounding), rounding, -arc1_e, -arc1_b, 3);
3327 draw_list->
PathArcTo(
ImVec2(x1, p1.
y - rounding), rounding, +arc1_b, +arc1_e, 3);
3343 draw_list->
AddRectFilled(p_min, p_max, col_bg1, rounding, rounding_corners_flags);
3346 for (
float y = p_min.
y + grid_off.
y;
y < p_max.
y;
y += grid_step, yi++)
3351 for (
float x = p_min.
x + grid_off.
x + (yi & 1) * grid_step;
x < p_max.
x;
x += grid_step * 2.0f)
3356 int rounding_corners_flags_cell = 0;
3359 rounding_corners_flags_cell &= rounding_corners_flags;
3360 draw_list->
AddRectFilled(
ImVec2(x1, y1),
ImVec2(x2, y2), col_bg2, rounding_corners_flags_cell ? rounding : 0.0
f, rounding_corners_flags_cell);
3366 draw_list->
AddRectFilled(p_min, p_max, col, rounding, rounding_corners_flags);
3405 #define stb__in2(x) ((i[x] << 8) + i[(x)+1])
3406 #define stb__in3(x) ((i[x] << 16) + stb__in2((x)+1))
3407 #define stb__in4(x) ((i[x] << 24) + stb__in3((x)+1))
3414 else stb__lit(
i+1,
i[0] - 0x20 + 1),
i += 1 + (
i[0] - 0x20 + 1);
3428 const unsigned long ADLER_MOD = 65521;
3429 unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16;
3430 unsigned long blocklen = buflen % 5552;
3434 for (
i=0;
i + 7 < blocklen;
i += 8) {
3435 s1 +=
buffer[0], s2 += s1;
3436 s1 +=
buffer[1], s2 += s1;
3437 s1 +=
buffer[2], s2 += s1;
3438 s1 +=
buffer[3], s2 += s1;
3439 s1 +=
buffer[4], s2 += s1;
3440 s1 +=
buffer[5], s2 += s1;
3441 s1 +=
buffer[6], s2 += s1;
3442 s1 +=
buffer[7], s2 += s1;
3447 for (;
i < blocklen; ++
i)
3448 s1 += *
buffer++, s2 += s1;
3450 s1 %= ADLER_MOD, s2 %= ADLER_MOD;
3454 return (
unsigned int)(s2 << 16) + (
unsigned int)s1;
3459 if (
stb__in4(0) != 0x57bC0000)
return 0;
3469 const unsigned char *old_i =
i;
3472 if (*
i == 0x05 &&
i[1] == 0xfa) {
3502 "7])#######hV0qs'/###[),##/l:$#Q6>##5[n42>c-TH`->>#/e>11NNV=Bv(*:.F?uu#(gRU.o0XGH`$vhLG1hxt9?W`#,5LsCp#-i>.r$<$6pD>Lb';9Crc6tgXmKVeU2cD4Eo3R/"
3503 "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#"
3504 "`8ND>Qo#t'X#(v#Y9w0#1D$CIf;W'#pWUPXOuxXuU(H9M(1<q-UE31#^-V'8IRUo7Qf./L>=Ke$$'5F%)]0^#0X@U.a<r:QLtFsLcL6##lOj)#.Y5<-R&KgLwqJfLgN&;Q?gI^#DY2uL"
3505 "i@^rMl9t=cWq6##weg>$FBjVQTSDgEKnIS7EM9>ZY9w0#L;>>#Mx&4Mvt//L[MkA#W@lK.N'[0#7RL_&#w+F%HtG9M#XL`N&.,GM4Pg;-<nLENhvx>-VsM.M0rJfLH2eTM`*oJMHRC`N"
3506 "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"
3507 "*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)"
3508 "tm+/Us9pG)XPu`<0s-)WTt(gCRxIg(%6sfh=ktMKn3j)<6<b5Sk_/0(^]AaN#(p/L>&VZ>1i%h1S9u5o@YaaW$e+b<TWFn/Z:Oh(Cx2$lNEoN^e)#CFY@@I;BOQ*sRwZtZxRcU7uW6CX"
3509 "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."
3510 "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"
3511 "CRUxHPeR`5Mjol(dUWxZa(>STrPkrJiWx`5U7F#.g*jrohGg`cg:lSTvEY/EV_7H4Q9[Z%cnv;JQYZ5q.l7Zeas:HOIZOB?G<Nald$qs]@]L<J7bR*>gv:[7MI2k).'2($5FNP&EQ(,)"
3512 "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#"
3513 "'/###xe7q.73rI3*pP/$1>s9)W,JrM7SN]'/4C#v$U`0#V.[0>xQsH$fEmPMgY2u7Kh(G%siIfLSoS+MK2eTM$=5,M8p`A.;_R%#u[K#$x4AG8.kK/HSB==-'Ie/QTtG?-.*^N-4B/ZM"
3514 "_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"
3515 "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/"
3516 "/oL?#h7gl85[qW/NDOk%16ij;+: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"
3517 "%a2E-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&#"
3518 "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)("
3519 "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"
3520 "o;#2:;%d	v68C5g?ntX0X)pT`;%pB3q7mgGN)3%(P8nTd5L7GeA-GL@+%J3u2:(Yf>et`e;)f#Km8&+DC$I46>#Kr]]u-[=99tts1.qb#q72g1WJO81q+eN'03'eM>&1XxY-caEnO"
3521 "j%2n8)),?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^-"
3522 "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-"
3523 "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"
3524 "M7-##.l+Au'A&O:-T72L]P`&=;ctp'XScX*rU.>-XTt,%OVU4)S1+R-#dg0/Nn?Ku1^0f$B*P:Rowwm-`0PKjYDDM'3]d39VZHEl4,.j']Pk-M.h^&:0FACm$maq-&sgw0t7/6(^xtk%"
3525 "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]"
3526 "%(?A%R$f<->Zts'^kn=-^@c4%-pY6qI%J%1IGxfLU9CP8cbPlXv);C=b),<2mOvP8up,UVf3839acAWAW-W?#ao/^#%KYo8fRULNd2.>%m]UK:n%r$'sw]J;5pAoO_#2mO3n,'=H5(et"
3527 "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%upV1g:"
3528 "a_#Ur7FuA#(tRh#.Y5K+@?3<-8m0$PEn;J:rh6?I6uG<-`wMU'ircp0LaE_OtlMb&1#6T.#FDKu#1Lw%u%+GM+X'e?YLfjM[VO0MbuFp7;>Q&#WIo)0@F%q7c#4XAXN-U&VB<HFF*qL("
3529 "$/V,;(kXZejWO`<[5?\?ewY(*9=%wDc;,u<'9t3W-(H1th3+G]ucQ]kLs7df($/*JL]@*t7Bu_G3_7mp7<iaQjO@.kLg;x3B0lqp7Hf,^Ze7-##@/c58Mo(3;knp0%)A7?-W+eI'o8)b<"
3530 "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?%C3.mM(=/M0:JxG'?"
3531 "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/;"
3532 ")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"
3533 "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("
3534 "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"
3535 "bIu)'Z,*[>br5fX^:FPAWr-m2KgL<LUN098kTF&#lvo58=/vjDo;.;)Ka*hLR#/k=rKbxuV`>Q_nN6'8uTGT5g)uLv:873UpTLgH+#FgpH'_o1780Ph8KmxQJ8#H72L4@768@Tm&Q"
3536 "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<-"
3537 "V8J'(1)G][68hW$5'q[GC&5j`TE?m'esFGNRM)j,ffZ?-qx8;->g4t*:CIP/[Qap7/9'#(1sao7w-.qNUdkJ)tCF&#B^;xGvn2r9FEPFFFcL@.iFNkTve$m%#QvQS8U@)2Z+3K:AKM5i"
3538 "sZ88+dKQ)W6>J%CL<KE>`.d*(B`-n8D9oK<Up]c$X$(,)M8Zt7/[rdkqTgl-0cuGMv'?>-XV1q['-5k'cAZ69e;D_?$ZPP&s^+7])$*$#@QYi9,5P	r+$%CE=68>K8r0=dSC%%(@p7"
3539 ".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@@"
3540 "$&)WHtPm*5_rO0&e%K&#-30j(E4#'Zb.o/(Tpm$>K'f@[PvFl,hfINTNU6u'0pao7%XUp9]5.>%h`8_=VYbxuel.NTSsJfLacFu3B'lQSu/m6-Oqem8T+oE--$0a/k]uj9EwsG>%veR*"
3541 "hv^BFpQj:K'#SJ,sB-'#](j.Lg92rTw-*n%@/;39rrJF,l#qV%OrtBeC6/,;qB3ebNW[?,Hqj2L.1NP&GjUR=1D8QaS3Up&@*9wP?+lo7b?@%'k4`p0Z$22%K3+iCZj?XJN4Nm&+YF]u"
3542 "@-W$U%VEQ/,,>>#)D<h#`)h0:<Q6909ua+&VU%n2:cG3FJ-%@Bj-DgLr`Hw&HAKjKjseK</xKT*)B,N9X3]krc12t'pgTV(Lv-tL[xg_%=M_q7a^x?7Ubd>#%8cY#YZ?=,`Wdxu/ae&#"
3543 "w6)R89tI#6@s'(6Bf7a&?S=^ZI_kS&ai`&=tE72L_D,;^R)7[$s<Eh#c&)q.MXI%#v9ROa5FZO%sF7q7Nwb&#ptUJ:aqJe$Sl68%.D###EC><?-aF&#RNQv>o8lKN%5/$(vdfq7+ebA#"
3544 "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"
3545 "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"
3546 "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&#"
3547 "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"
3548 ":k$YUWsbn8ogh6rxZ2Z9]%nd+>V#*8U_72Lh+2Q8Cj0i:6hp&$C/:p(HK>T8Y[gHQ4`4)'$Ab(Nof%V'8hL&#<NEdtg(n'=S1A(Q1/I&4([%dM`,Iu'1:_hL>SfD07&6D<fp8dHM7/g+"
3549 "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*"
3550 "$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"
3551 ":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"
3552 "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"
3553 "u][`*S^43933A4rl][`*O4CgLEl]v$1Q3AeF37dbXk,.)vj#x'd`;qgbQR%FW,2(?LO=s%Sc68%NP'##Aotl8x=BE#j1UD([3$M(]UI2LX3RpKN@;/#f'f/&_mt&F)XdF<9t4)Qa.*kT"
3554 "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"
3555 ":^#M*Q+[T.Xri.LYS3v%fF`68h;b-X[/En'CR.q7E)p'/kle2HM,u;^%OKC-N+Ll%F9CF<Nf'^#t2L,;27W:0O@6##U6W7:$rJfLWHj$#)woqBefIZ.PK<b*t7ed;p*_m;4ExK#h@&]>"
3556 "_>@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%-Gb%"
3557 "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;"
3558 "^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%is00:"
3559 "+A4[7xks.LrNk0&E)wILYF@2L'0Nb$+pv<(2.768/FrY&h$^3i&@+G%JT'<-,v`3;_)I9M^AE]CN?Cl2AZg+%4iTpT3<n-&%H%b<FDj2M<hH=&Eh<2Len$b*aTX=-8QxN)k11IM1c^j%"
3560 "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-"
3561 "CdQ*:Ir<($u&)#(&?L9Rg3H)4fiEp^iI9O8KnTj,]H?D*r7'M;PwZ9K0E^k&-cpI;.p/6_vwoFMV<->#%Xi.LxVnrU(4&8/P+:hLSKj$#U%]49t'I:rgMi'FL@a:0Y-uA[39',(vbma*"
3562 "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"
3563 "8kD2)2fU/M#$e.)T4,_=8hLim[&);?UkK'-x?'(:siIfL<$pFM`i<?%W(mGDHM%>iWP,##P`%/L<eXi:@Z9C.7o=@(pXdAO/NLQ8lPl+HPOQa8wD8=^GlPa8TKI1CjhsCTSLJM'/Wl>-"
3564 "S(qw%sf/@%#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`"
3565 "0?t/'_U59@]ddF<#LdF<eWdF<OuN/45rY<-L@&#+fm>69=Lb,OcZV/);TTm8VI;?%OtJ<(b4mq7M6:u?KRdF<gR@2L=FNU-<b[(9c/ML3m;Z[$oF3g)GAWqpARc=<ROu7cL5l;-[A]%/"
3566 "+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"
3567 "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"
3568 "?6*C()dOp7:WL,b&3Rg/.cmM9&r^>$(>.Z-I&J(Q0Hd5Q%7Co-b`-c<N(6r@ip+AurK<m86QIth*#v;-OBqi+L7wDE-Ir8K['m+DDSLwK&/.?-V%U_%3:qKNu$_b*B-kp7NaD'QdWQPK"
3569 "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%gAAO(S>WlA2);Sa"
3570 ">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%>%Ul:#/'xoFM9QX-$.QN'>"
3571 "[%$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"
3572 "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#"
3573 "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$"
3574 "MlvAF_jCK*.O-^(63adMT->W%iewS8W6m2rtCpo'RS1R84=@paTKt)>=%&1[)*vp'u+x,VrwN;&]kuO9JDbg=pO$J*.jVe;u'm0dr9l,<*wMK*Oe=g8lV_KEBFkO'oU]^=[-792#ok,)"
3575 "i]lR8qQ2oA8wcRCZ^7w/Njh;?.stX?Q1>S1q4Bn$)K1<-rGdO'$Wr.Lc.CG)$/*JL4tNR/,SVO3,aUw'DJN:)Ss;wGn9A32ijw%FL+Z0Fn.U9;reSq)bmI32U==5ALuG&#Vf1398/pVo"
3576 "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"
3577 "iDDG)g,r%+?,$@?uou5tSe2aN_AQU*<h`e-GI7)?OK2A.d7_c)?wQ5AS@DL3r#7fSkgl6-++D:'A,uq7SvlB$pcpH'q3n0#_%dY#xCpr-l<F0NR@-##FEV6NTF6##$l84N1w?AO>'IAO"
3578 "URQ##V^Fv-XFbGM7Fl(N<3DhLGF%q.1rC$#:T__&Pi68%0xi_&[qFJ(77j_&JWoF.V735&T,[R*:xFR*K5>>#`bW-?4Ne_&6Ne_&6Ne_&n`kr-#GJcM6X;uM6X;uM(.a..^2TkL%oR(#"
3579 ";u.T%fAr%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&>"
3580 "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#"
3581 "d<F&#*;G##.GY##2Sl##6`($#:l:$#>xL$#B.`$#F:r$#JF.%#NR@%#R_R%#Vke%#Zww%#_-4^Rh%Sflr-k'MS.o?.5/sWel/wpEM0%3'/1)K^f1-d>G21&v(35>V`39V7A4=onx4"
3582 "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#"
3583 "/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-#"
3584 "m3B2#SB[8#Q0@8#i[*9#iOn8#1Nm;#^sN9#qh<9#:=x-#P;K2#$%X9#bC+.#Rg;<#mN=.#MTF.#RZO.#2?)4#Y#(/#[)1/#b;L/#dAU/#0Sv;#lY$0#n`-0#sf60#(F24#wrH0#%/e0#"
3585 "TmD<#%JSMFove:CTBEXI:<eh2g)B,3h2^G3i;#d3jD>)4kMYD4lVu`4m`:&5niUA5@(A5BA1]PBB:xlBCC=2CDLXMCEUtiCf&0g2'tN?PGT4CPGT4CPGT4CPGT4CPGT4CPGT4CPGT4CP"
3586 "GT4CPGT4CPGT4CPGT4CPGT4CPGT4CP-qekC`.9kEg^+F$kwViFJTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5o,^<-28ZI'O?;xp"
3587 "O?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xp;7q-#lLYI:xvD=#";
3594 #endif // #ifndef IMGUI_DISABLE