mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-23 21:09:01 +08:00
Merge miscellaneous small changes to reduce drift with texture update branch.
- ImGuiDebugLogFlags_EventFont is yet unused.
This commit is contained in:
parent
551b6c4d66
commit
20360e00ce
@ -164,6 +164,7 @@
|
|||||||
// In the rest of your app/engine, you can use another loader of your choice (gl3w, glew, glad, glbinding, glext, glLoadGen, etc.).
|
// In the rest of your app/engine, you can use another loader of your choice (gl3w, glew, glad, glbinding, glext, glLoadGen, etc.).
|
||||||
// If you happen to be developing a new feature for this backend (imgui_impl_opengl3.cpp):
|
// If you happen to be developing a new feature for this backend (imgui_impl_opengl3.cpp):
|
||||||
// - You may need to regenerate imgui_impl_opengl3_loader.h to add new symbols. See https://github.com/dearimgui/gl3w_stripped
|
// - You may need to regenerate imgui_impl_opengl3_loader.h to add new symbols. See https://github.com/dearimgui/gl3w_stripped
|
||||||
|
// Typically you would run: python3 ./gl3w_gen.py --output ../imgui/backends/imgui_impl_opengl3_loader.h --ref ../imgui/backends/imgui_impl_opengl3.cpp ./extra_symbols.txt
|
||||||
// - You can temporarily use an unstripped version. See https://github.com/dearimgui/gl3w_stripped/releases
|
// - You can temporarily use an unstripped version. See https://github.com/dearimgui/gl3w_stripped/releases
|
||||||
// Changes to this backend using new APIs should be accompanied by a regenerated stripped loader version.
|
// Changes to this backend using new APIs should be accompanied by a regenerated stripped loader version.
|
||||||
#define IMGL3W_IMPL
|
#define IMGL3W_IMPL
|
||||||
@ -689,7 +690,7 @@ bool ImGui_ImplOpenGL3_CreateFontsTexture()
|
|||||||
#endif
|
#endif
|
||||||
GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels));
|
GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels));
|
||||||
|
|
||||||
// Store our identifier
|
// Store identifier
|
||||||
io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture);
|
io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture);
|
||||||
|
|
||||||
// Restore state
|
// Restore state
|
||||||
|
28
imgui.cpp
28
imgui.cpp
@ -4010,7 +4010,7 @@ ImGuiContext::ImGuiContext(ImFontAtlas* shared_font_atlas)
|
|||||||
StackSizesInBeginForCurrentWindow = NULL;
|
StackSizesInBeginForCurrentWindow = NULL;
|
||||||
|
|
||||||
DebugDrawIdConflictsCount = 0;
|
DebugDrawIdConflictsCount = 0;
|
||||||
DebugLogFlags = ImGuiDebugLogFlags_EventError | ImGuiDebugLogFlags_OutputToTTY;
|
DebugLogFlags = ImGuiDebugLogFlags_EventError | ImGuiDebugLogFlags_OutputToTTY | ImGuiDebugLogFlags_EventFont;
|
||||||
DebugLocateId = 0;
|
DebugLocateId = 0;
|
||||||
DebugLogSkippedErrors = 0;
|
DebugLogSkippedErrors = 0;
|
||||||
DebugLogAutoDisableFlags = ImGuiDebugLogFlags_None;
|
DebugLogAutoDisableFlags = ImGuiDebugLogFlags_None;
|
||||||
@ -4226,8 +4226,8 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* ctx, const char* name) : DrawListInst(NUL
|
|||||||
FontWindowScale = 1.0f;
|
FontWindowScale = 1.0f;
|
||||||
SettingsOffset = -1;
|
SettingsOffset = -1;
|
||||||
DrawList = &DrawListInst;
|
DrawList = &DrawListInst;
|
||||||
DrawList->_Data = &Ctx->DrawListSharedData;
|
|
||||||
DrawList->_OwnerName = Name;
|
DrawList->_OwnerName = Name;
|
||||||
|
DrawList->_Data = &Ctx->DrawListSharedData;
|
||||||
NavPreferredScoringPosRel[0] = NavPreferredScoringPosRel[1] = ImVec2(FLT_MAX, FLT_MAX);
|
NavPreferredScoringPosRel[0] = NavPreferredScoringPosRel[1] = ImVec2(FLT_MAX, FLT_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5025,7 +5025,7 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags()
|
|||||||
io.WantTextInput = (g.WantTextInputNextFrame != -1) ? (g.WantTextInputNextFrame != 0) : false;
|
io.WantTextInput = (g.WantTextInputNextFrame != -1) ? (g.WantTextInputNextFrame != 0) : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calling SetupDrawListSharedData() is followed by SetCurrentFont() which sets up the remaining data.
|
// Called once a frame. Followed by SetCurrentFont() which sets up the remaining data.
|
||||||
static void SetupDrawListSharedData()
|
static void SetupDrawListSharedData()
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
@ -15180,6 +15180,17 @@ void ImGui::UpdateDebugToolFlashStyleColor()
|
|||||||
DebugFlashStyleColorStop();
|
DebugFlashStyleColorStop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* FormatTextureIDForDebugDisplay(char* buf, int buf_size, ImTextureID tex_id)
|
||||||
|
{
|
||||||
|
union { void* ptr; int integer; } tex_id_opaque;
|
||||||
|
memcpy(&tex_id_opaque, &tex_id, ImMin(sizeof(void*), sizeof(tex_id)));
|
||||||
|
if (sizeof(tex_id) >= sizeof(void*))
|
||||||
|
ImFormatString(buf, buf_size, "0x%p", tex_id_opaque.ptr);
|
||||||
|
else
|
||||||
|
ImFormatString(buf, buf_size, "0x%04X", tex_id_opaque.integer);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
// Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds.
|
// Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds.
|
||||||
static void MetricsHelpMarker(const char* desc)
|
static void MetricsHelpMarker(const char* desc)
|
||||||
{
|
{
|
||||||
@ -15868,16 +15879,6 @@ void ImGui::DebugNodeColumns(ImGuiOldColumns* columns)
|
|||||||
TreePop();
|
TreePop();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FormatTextureIDForDebugDisplay(char* buf, int buf_size, ImTextureID tex_id)
|
|
||||||
{
|
|
||||||
union { void* ptr; int integer; } tex_id_opaque;
|
|
||||||
memcpy(&tex_id_opaque, &tex_id, ImMin(sizeof(void*), sizeof(tex_id)));
|
|
||||||
if (sizeof(tex_id) >= sizeof(void*))
|
|
||||||
ImFormatString(buf, buf_size, "0x%p", tex_id_opaque.ptr);
|
|
||||||
else
|
|
||||||
ImFormatString(buf, buf_size, "0x%04X", tex_id_opaque.integer);
|
|
||||||
}
|
|
||||||
|
|
||||||
// [DEBUG] Display contents of ImDrawList
|
// [DEBUG] Display contents of ImDrawList
|
||||||
void ImGui::DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, const ImDrawList* draw_list, const char* label)
|
void ImGui::DebugNodeDrawList(ImGuiWindow* window, ImGuiViewportP* viewport, const ImDrawList* draw_list, const char* label)
|
||||||
{
|
{
|
||||||
@ -16379,6 +16380,7 @@ void ImGui::ShowDebugLogWindow(bool* p_open)
|
|||||||
ShowDebugLogFlag("Clipper", ImGuiDebugLogFlags_EventClipper);
|
ShowDebugLogFlag("Clipper", ImGuiDebugLogFlags_EventClipper);
|
||||||
ShowDebugLogFlag("Focus", ImGuiDebugLogFlags_EventFocus);
|
ShowDebugLogFlag("Focus", ImGuiDebugLogFlags_EventFocus);
|
||||||
ShowDebugLogFlag("IO", ImGuiDebugLogFlags_EventIO);
|
ShowDebugLogFlag("IO", ImGuiDebugLogFlags_EventIO);
|
||||||
|
//ShowDebugLogFlag("Font", ImGuiDebugLogFlags_EventFont);
|
||||||
ShowDebugLogFlag("Nav", ImGuiDebugLogFlags_EventNav);
|
ShowDebugLogFlag("Nav", ImGuiDebugLogFlags_EventNav);
|
||||||
ShowDebugLogFlag("Popup", ImGuiDebugLogFlags_EventPopup);
|
ShowDebugLogFlag("Popup", ImGuiDebugLogFlags_EventPopup);
|
||||||
ShowDebugLogFlag("Selection", ImGuiDebugLogFlags_EventSelection);
|
ShowDebugLogFlag("Selection", ImGuiDebugLogFlags_EventSelection);
|
||||||
|
19
imgui.h
19
imgui.h
@ -2309,6 +2309,7 @@ struct ImGuiIO
|
|||||||
// (the imgui_impl_xxxx backend files are setting those up for you)
|
// (the imgui_impl_xxxx backend files are setting those up for you)
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Nowadays those would be stored in ImGuiPlatformIO but we are leaving them here for legacy reasons.
|
||||||
// Optional: Platform/Renderer backend name (informational only! will be displayed in About Window) + User data for backend/wrappers to store their own stuff.
|
// Optional: Platform/Renderer backend name (informational only! will be displayed in About Window) + User data for backend/wrappers to store their own stuff.
|
||||||
const char* BackendPlatformName; // = NULL
|
const char* BackendPlatformName; // = NULL
|
||||||
const char* BackendRendererName; // = NULL
|
const char* BackendRendererName; // = NULL
|
||||||
@ -3064,10 +3065,11 @@ struct ImDrawList
|
|||||||
float _FringeScale; // [Internal] anti-alias fringe is scaled by this value, this helps to keep things sharp while zooming at vertex buffer content
|
float _FringeScale; // [Internal] anti-alias fringe is scaled by this value, this helps to keep things sharp while zooming at vertex buffer content
|
||||||
const char* _OwnerName; // Pointer to owner window's name for debugging
|
const char* _OwnerName; // Pointer to owner window's name for debugging
|
||||||
|
|
||||||
// If you want to create ImDrawList instances, pass them ImGui::GetDrawListSharedData() or create and use your own ImDrawListSharedData (so you can use ImDrawList without ImGui)
|
// If you want to create ImDrawList instances, pass them ImGui::GetDrawListSharedData().
|
||||||
ImDrawList(ImDrawListSharedData* shared_data) { memset(this, 0, sizeof(*this)); _Data = shared_data; }
|
// (advanced: you may create and use your own ImDrawListSharedData so you can use ImDrawList without ImGui, but that's more involved)
|
||||||
|
IMGUI_API ImDrawList(ImDrawListSharedData* shared_data);
|
||||||
~ImDrawList() { _ClearFreeMemory(); }
|
IMGUI_API ~ImDrawList();
|
||||||
|
|
||||||
IMGUI_API void PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect = false); // Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling)
|
IMGUI_API void PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect = false); // Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling)
|
||||||
IMGUI_API void PushClipRectFullScreen();
|
IMGUI_API void PushClipRectFullScreen();
|
||||||
IMGUI_API void PopClipRect();
|
IMGUI_API void PopClipRect();
|
||||||
@ -3277,14 +3279,16 @@ struct ImFontGlyphRangesBuilder
|
|||||||
// See ImFontAtlas::AddCustomRectXXX functions.
|
// See ImFontAtlas::AddCustomRectXXX functions.
|
||||||
struct ImFontAtlasCustomRect
|
struct ImFontAtlasCustomRect
|
||||||
{
|
{
|
||||||
unsigned short Width, Height; // Input // Desired rectangle dimension
|
|
||||||
unsigned short X, Y; // Output // Packed position in Atlas
|
unsigned short X, Y; // Output // Packed position in Atlas
|
||||||
|
|
||||||
|
// [Internal]
|
||||||
|
unsigned short Width, Height; // Input // Desired rectangle dimension
|
||||||
unsigned int GlyphID : 31; // Input // For custom font glyphs only (ID < 0x110000)
|
unsigned int GlyphID : 31; // Input // For custom font glyphs only (ID < 0x110000)
|
||||||
unsigned int GlyphColored : 1; // Input // For custom font glyphs only: glyph is colored, removed tinting.
|
unsigned int GlyphColored : 1; // Input // For custom font glyphs only: glyph is colored, removed tinting.
|
||||||
float GlyphAdvanceX; // Input // For custom font glyphs only: glyph xadvance
|
float GlyphAdvanceX; // Input // For custom font glyphs only: glyph xadvance
|
||||||
ImVec2 GlyphOffset; // Input // For custom font glyphs only: glyph display offset
|
ImVec2 GlyphOffset; // Input // For custom font glyphs only: glyph display offset
|
||||||
ImFont* Font; // Input // For custom font glyphs only: target font
|
ImFont* Font; // Input // For custom font glyphs only: target font
|
||||||
ImFontAtlasCustomRect() { Width = Height = 0; X = Y = 0xFFFF; GlyphID = 0; GlyphColored = 0; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0, 0); Font = NULL; }
|
ImFontAtlasCustomRect() { X = Y = 0xFFFF; Width = Height = 0; GlyphID = 0; GlyphColored = 0; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0, 0); Font = NULL; }
|
||||||
bool IsPacked() const { return X != 0xFFFF; }
|
bool IsPacked() const { return X != 0xFFFF; }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3431,8 +3435,9 @@ struct ImFont
|
|||||||
const ImFontGlyph* FallbackGlyph; // 4-8 // out // = FindGlyph(FontFallbackChar)
|
const ImFontGlyph* FallbackGlyph; // 4-8 // out // = FindGlyph(FontFallbackChar)
|
||||||
|
|
||||||
// Members: Cold ~32/40 bytes
|
// Members: Cold ~32/40 bytes
|
||||||
|
// Conceptually ConfigData[] is the list of font sources merged to create this font.
|
||||||
ImFontAtlas* ContainerAtlas; // 4-8 // out // // What we has been loaded into
|
ImFontAtlas* ContainerAtlas; // 4-8 // out // // What we has been loaded into
|
||||||
const ImFontConfig* ConfigData; // 4-8 // in // // Pointer within ContainerAtlas->ConfigData
|
const ImFontConfig* ConfigData; // 4-8 // in // // Pointer within ContainerAtlas->ConfigData to ConfigDataCount instances
|
||||||
short ConfigDataCount; // 2 // in // ~ 1 // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont.
|
short ConfigDataCount; // 2 // in // ~ 1 // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont.
|
||||||
ImWchar FallbackChar; // 2 // out // = FFFD/'?' // Character used if a glyph isn't found.
|
ImWchar FallbackChar; // 2 // out // = FFFD/'?' // Character used if a glyph isn't found.
|
||||||
ImWchar EllipsisChar; // 2 // out // = '...'/'.'// Character used for ellipsis rendering.
|
ImWchar EllipsisChar; // 2 // out // = '...'/'.'// Character used for ellipsis rendering.
|
||||||
|
@ -14,7 +14,7 @@ Index of this file:
|
|||||||
// [SECTION] Helpers ShadeVertsXXX functions
|
// [SECTION] Helpers ShadeVertsXXX functions
|
||||||
// [SECTION] ImFontConfig
|
// [SECTION] ImFontConfig
|
||||||
// [SECTION] ImFontAtlas
|
// [SECTION] ImFontAtlas
|
||||||
// [SECTION] ImFontAtlas glyph ranges helpers
|
// [SECTION] ImFontAtlas: glyph ranges helpers
|
||||||
// [SECTION] ImFontGlyphRangesBuilder
|
// [SECTION] ImFontGlyphRangesBuilder
|
||||||
// [SECTION] ImFont
|
// [SECTION] ImFont
|
||||||
// [SECTION] ImGui Internal Render Helpers
|
// [SECTION] ImGui Internal Render Helpers
|
||||||
@ -394,6 +394,17 @@ void ImDrawListSharedData::SetCircleTessellationMaxError(float max_error)
|
|||||||
ArcFastRadiusCutoff = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(IM_DRAWLIST_ARCFAST_SAMPLE_MAX, CircleSegmentMaxError);
|
ArcFastRadiusCutoff = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(IM_DRAWLIST_ARCFAST_SAMPLE_MAX, CircleSegmentMaxError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ImDrawList::ImDrawList(ImDrawListSharedData* shared_data)
|
||||||
|
{
|
||||||
|
memset(this, 0, sizeof(*this));
|
||||||
|
_Data = shared_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImDrawList::~ImDrawList()
|
||||||
|
{
|
||||||
|
_ClearFreeMemory();
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize before use in a new frame. We always have a command ready in the buffer.
|
// Initialize before use in a new frame. We always have a command ready in the buffer.
|
||||||
// In the majority of cases, you would want to call PushClipRect() and PushTextureID() after this.
|
// In the majority of cases, you would want to call PushClipRect() and PushTextureID() after this.
|
||||||
void ImDrawList::_ResetForNewFrame()
|
void ImDrawList::_ResetForNewFrame()
|
||||||
@ -2528,6 +2539,7 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg)
|
|||||||
IM_ASSERT(font_cfg->FontData != NULL && font_cfg->FontDataSize > 0);
|
IM_ASSERT(font_cfg->FontData != NULL && font_cfg->FontDataSize > 0);
|
||||||
IM_ASSERT(font_cfg->SizePixels > 0.0f && "Is ImFontConfig struct correctly initialized?");
|
IM_ASSERT(font_cfg->SizePixels > 0.0f && "Is ImFontConfig struct correctly initialized?");
|
||||||
IM_ASSERT(font_cfg->OversampleH > 0 && font_cfg->OversampleV > 0 && "Is ImFontConfig struct correctly initialized?");
|
IM_ASSERT(font_cfg->OversampleH > 0 && font_cfg->OversampleV > 0 && "Is ImFontConfig struct correctly initialized?");
|
||||||
|
IM_ASSERT(font_cfg->RasterizerDensity > 0.0f);
|
||||||
|
|
||||||
// Create new font
|
// Create new font
|
||||||
if (!font_cfg->MergeMode)
|
if (!font_cfg->MergeMode)
|
||||||
@ -2546,9 +2558,16 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg)
|
|||||||
memcpy(new_font_cfg.FontData, font_cfg->FontData, (size_t)new_font_cfg.FontDataSize);
|
memcpy(new_font_cfg.FontData, font_cfg->FontData, (size_t)new_font_cfg.FontDataSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Round font size
|
||||||
|
// - We started rounding in 1.90 WIP (18991) as our layout system currently doesn't support non-rounded font size well yet.
|
||||||
|
// - Note that using io.FontGlobalScale or SetWindowFontScale(), with are legacy-ish, partially supported features, can still lead to unrounded sizes.
|
||||||
|
// - We may support it better later and remove this rounding.
|
||||||
|
new_font_cfg.SizePixels = ImTrunc(new_font_cfg.SizePixels);
|
||||||
|
|
||||||
if (new_font_cfg.DstFont->EllipsisChar == (ImWchar)-1)
|
if (new_font_cfg.DstFont->EllipsisChar == (ImWchar)-1)
|
||||||
new_font_cfg.DstFont->EllipsisChar = font_cfg->EllipsisChar;
|
new_font_cfg.DstFont->EllipsisChar = font_cfg->EllipsisChar;
|
||||||
|
|
||||||
|
// Pointers to ConfigData and BuilderData are otherwise dangling
|
||||||
ImFontAtlasUpdateConfigDataPointers(this);
|
ImFontAtlasUpdateConfigDataPointers(this);
|
||||||
|
|
||||||
// Invalidate texture
|
// Invalidate texture
|
||||||
@ -3163,9 +3182,23 @@ static void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas)
|
|||||||
IM_ASSERT(r->IsPacked());
|
IM_ASSERT(r->IsPacked());
|
||||||
|
|
||||||
const int w = atlas->TexWidth;
|
const int w = atlas->TexWidth;
|
||||||
if (!(atlas->Flags & ImFontAtlasFlags_NoMouseCursors))
|
if (atlas->Flags & ImFontAtlasFlags_NoMouseCursors)
|
||||||
{
|
{
|
||||||
// Render/copy pixels
|
// White pixels only
|
||||||
|
IM_ASSERT(r->Width == 2 && r->Height == 2);
|
||||||
|
const int offset = (int)r->X + (int)r->Y * w;
|
||||||
|
if (atlas->TexPixelsAlpha8 != NULL)
|
||||||
|
{
|
||||||
|
atlas->TexPixelsAlpha8[offset] = atlas->TexPixelsAlpha8[offset + 1] = atlas->TexPixelsAlpha8[offset + w] = atlas->TexPixelsAlpha8[offset + w + 1] = 0xFF;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
atlas->TexPixelsRGBA32[offset] = atlas->TexPixelsRGBA32[offset + 1] = atlas->TexPixelsRGBA32[offset + w] = atlas->TexPixelsRGBA32[offset + w + 1] = IM_COL32_WHITE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// White pixels and mouse cursor
|
||||||
IM_ASSERT(r->Width == FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1 && r->Height == FONT_ATLAS_DEFAULT_TEX_DATA_H);
|
IM_ASSERT(r->Width == FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1 && r->Height == FONT_ATLAS_DEFAULT_TEX_DATA_H);
|
||||||
const int x_for_white = r->X;
|
const int x_for_white = r->X;
|
||||||
const int x_for_black = r->X + FONT_ATLAS_DEFAULT_TEX_DATA_W + 1;
|
const int x_for_black = r->X + FONT_ATLAS_DEFAULT_TEX_DATA_W + 1;
|
||||||
@ -3180,20 +3213,6 @@ static void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas)
|
|||||||
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);
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
// Render 4 white pixels
|
|
||||||
IM_ASSERT(r->Width == 2 && r->Height == 2);
|
|
||||||
const int offset = (int)r->X + (int)r->Y * w;
|
|
||||||
if (atlas->TexPixelsAlpha8 != NULL)
|
|
||||||
{
|
|
||||||
atlas->TexPixelsAlpha8[offset] = atlas->TexPixelsAlpha8[offset + 1] = atlas->TexPixelsAlpha8[offset + w] = atlas->TexPixelsAlpha8[offset + w + 1] = 0xFF;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
atlas->TexPixelsRGBA32[offset] = atlas->TexPixelsRGBA32[offset + 1] = atlas->TexPixelsRGBA32[offset + w] = atlas->TexPixelsRGBA32[offset + w + 1] = IM_COL32_WHITE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
atlas->TexUvWhitePixel = ImVec2((r->X + 0.5f) * atlas->TexUvScale.x, (r->Y + 0.5f) * atlas->TexUvScale.y);
|
atlas->TexUvWhitePixel = ImVec2((r->X + 0.5f) * atlas->TexUvScale.x, (r->Y + 0.5f) * atlas->TexUvScale.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3205,38 +3224,38 @@ static void ImFontAtlasBuildRenderLinesTexData(ImFontAtlas* atlas)
|
|||||||
// This generates a triangular shape in the texture, with the various line widths stacked on top of each other to allow interpolation between them
|
// This generates a triangular shape in the texture, with the various line widths stacked on top of each other to allow interpolation between them
|
||||||
ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(atlas->PackIdLines);
|
ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(atlas->PackIdLines);
|
||||||
IM_ASSERT(r->IsPacked());
|
IM_ASSERT(r->IsPacked());
|
||||||
for (unsigned int n = 0; n < IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1; n++) // +1 because of the zero-width row
|
for (int n = 0; n < IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1; n++) // +1 because of the zero-width row
|
||||||
{
|
{
|
||||||
// Each line consists of at least two empty pixels at the ends, with a line of solid pixels in the middle
|
// Each line consists of at least two empty pixels at the ends, with a line of solid pixels in the middle
|
||||||
unsigned int y = n;
|
int y = n;
|
||||||
unsigned int line_width = n;
|
int line_width = n;
|
||||||
unsigned int pad_left = (r->Width - line_width) / 2;
|
int pad_left = (r->Width - line_width) / 2;
|
||||||
unsigned int pad_right = r->Width - (pad_left + line_width);
|
int pad_right = r->Width - (pad_left + line_width);
|
||||||
|
|
||||||
// Write each slice
|
// Write each slice
|
||||||
IM_ASSERT(pad_left + line_width + pad_right == r->Width && y < r->Height); // Make sure we're inside the texture bounds before we start writing pixels
|
IM_ASSERT(pad_left + line_width + pad_right == r->Width && y < r->Height); // Make sure we're inside the texture bounds before we start writing pixels
|
||||||
if (atlas->TexPixelsAlpha8 != NULL)
|
if (atlas->TexPixelsAlpha8 != NULL)
|
||||||
{
|
{
|
||||||
unsigned char* write_ptr = &atlas->TexPixelsAlpha8[r->X + ((r->Y + y) * atlas->TexWidth)];
|
unsigned char* write_ptr = &atlas->TexPixelsAlpha8[r->X + ((r->Y + y) * atlas->TexWidth)];
|
||||||
for (unsigned int i = 0; i < pad_left; i++)
|
for (int i = 0; i < pad_left; i++)
|
||||||
*(write_ptr + i) = 0x00;
|
*(write_ptr + i) = 0x00;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < line_width; i++)
|
for (int i = 0; i < line_width; i++)
|
||||||
*(write_ptr + pad_left + i) = 0xFF;
|
*(write_ptr + pad_left + i) = 0xFF;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < pad_right; i++)
|
for (int i = 0; i < pad_right; i++)
|
||||||
*(write_ptr + pad_left + line_width + i) = 0x00;
|
*(write_ptr + pad_left + line_width + i) = 0x00;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
unsigned int* write_ptr = &atlas->TexPixelsRGBA32[r->X + ((r->Y + y) * atlas->TexWidth)];
|
unsigned int* write_ptr = &atlas->TexPixelsRGBA32[r->X + ((r->Y + y) * atlas->TexWidth)];
|
||||||
for (unsigned int i = 0; i < pad_left; i++)
|
for (int i = 0; i < pad_left; i++)
|
||||||
*(write_ptr + i) = IM_COL32(255, 255, 255, 0);
|
*(write_ptr + i) = IM_COL32(255, 255, 255, 0);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < line_width; i++)
|
for (int i = 0; i < line_width; i++)
|
||||||
*(write_ptr + pad_left + i) = IM_COL32_WHITE;
|
*(write_ptr + pad_left + i) = IM_COL32_WHITE;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < pad_right; i++)
|
for (int i = 0; i < pad_right; i++)
|
||||||
*(write_ptr + pad_left + line_width + i) = IM_COL32(255, 255, 255, 0);
|
*(write_ptr + pad_left + line_width + i) = IM_COL32(255, 255, 255, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3251,13 +3270,6 @@ static void ImFontAtlasBuildRenderLinesTexData(ImFontAtlas* atlas)
|
|||||||
// Note: this is called / shared by both the stb_truetype and the FreeType builder
|
// Note: this is called / shared by both the stb_truetype and the FreeType builder
|
||||||
void ImFontAtlasBuildInit(ImFontAtlas* atlas)
|
void ImFontAtlasBuildInit(ImFontAtlas* atlas)
|
||||||
{
|
{
|
||||||
// Round font size
|
|
||||||
// - We started rounding in 1.90 WIP (18991) as our layout system currently doesn't support non-rounded font size well yet.
|
|
||||||
// - Note that using io.FontGlobalScale or SetWindowFontScale(), with are legacy-ish, partially supported features, can still lead to unrounded sizes.
|
|
||||||
// - We may support it better later and remove this rounding.
|
|
||||||
for (ImFontConfig& cfg : atlas->ConfigData)
|
|
||||||
cfg.SizePixels = ImTrunc(cfg.SizePixels);
|
|
||||||
|
|
||||||
// Register texture region for mouse cursors or standard white pixels
|
// Register texture region for mouse cursors or standard white pixels
|
||||||
if (atlas->PackIdMouseCursors < 0)
|
if (atlas->PackIdMouseCursors < 0)
|
||||||
{
|
{
|
||||||
@ -3308,6 +3320,10 @@ void ImFontAtlasBuildFinish(ImFontAtlas* atlas)
|
|||||||
atlas->TexReady = true;
|
atlas->TexReady = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
// [SECTION] ImFontAtlas: glyph ranges helpers
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
|
||||||
// Retrieve list of range (2 int per range, values are inclusive)
|
// Retrieve list of range (2 int per range, values are inclusive)
|
||||||
const ImWchar* ImFontAtlas::GetGlyphRangesDefault()
|
const ImWchar* ImFontAtlas::GetGlyphRangesDefault()
|
||||||
{
|
{
|
||||||
@ -3369,10 +3385,6 @@ static void UnpackAccumulativeOffsetsIntoRanges(int base_codepoint, const short*
|
|||||||
out_ranges[0] = 0;
|
out_ranges[0] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
|
||||||
// [SECTION] ImFontAtlas glyph ranges helpers
|
|
||||||
//-------------------------------------------------------------------------
|
|
||||||
|
|
||||||
const ImWchar* ImFontAtlas::GetGlyphRangesChineseSimplifiedCommon()
|
const ImWchar* ImFontAtlas::GetGlyphRangesChineseSimplifiedCommon()
|
||||||
{
|
{
|
||||||
// Store 2500 regularly used characters for Simplified Chinese.
|
// Store 2500 regularly used characters for Simplified Chinese.
|
||||||
@ -3799,8 +3811,9 @@ void ImFont::AddGlyph(const ImFontConfig* cfg, ImWchar codepoint, float x0, floa
|
|||||||
advance_x += cfg->GlyphExtraSpacing.x;
|
advance_x += cfg->GlyphExtraSpacing.x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int glyph_idx = Glyphs.Size;
|
||||||
Glyphs.resize(Glyphs.Size + 1);
|
Glyphs.resize(Glyphs.Size + 1);
|
||||||
ImFontGlyph& glyph = Glyphs.back();
|
ImFontGlyph& glyph = Glyphs[glyph_idx];
|
||||||
glyph.Codepoint = (unsigned int)codepoint;
|
glyph.Codepoint = (unsigned int)codepoint;
|
||||||
glyph.Visible = (x0 != x1) && (y0 != y1);
|
glyph.Visible = (x0 != x1) && (y0 != y1);
|
||||||
glyph.Colored = false;
|
glyph.Colored = false;
|
||||||
@ -3836,6 +3849,7 @@ void ImFont::AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst)
|
|||||||
IndexAdvanceX[dst] = (src < index_size) ? IndexAdvanceX.Data[src] : 1.0f;
|
IndexAdvanceX[dst] = (src < index_size) ? IndexAdvanceX.Data[src] : 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Find glyph, return fallback if missing
|
||||||
const ImFontGlyph* ImFont::FindGlyph(ImWchar c)
|
const ImFontGlyph* ImFont::FindGlyph(ImWchar c)
|
||||||
{
|
{
|
||||||
if (c >= (size_t)IndexLookup.Size)
|
if (c >= (size_t)IndexLookup.Size)
|
||||||
|
@ -212,11 +212,6 @@ extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Debug Logging for ShowDebugLogWindow(). This is designed for relatively rare events so please don't spam.
|
// Debug Logging for ShowDebugLogWindow(). This is designed for relatively rare events so please don't spam.
|
||||||
#ifndef IMGUI_DISABLE_DEBUG_TOOLS
|
|
||||||
#define IMGUI_DEBUG_LOG(...) ImGui::DebugLog(__VA_ARGS__)
|
|
||||||
#else
|
|
||||||
#define IMGUI_DEBUG_LOG(...) ((void)0)
|
|
||||||
#endif
|
|
||||||
#define IMGUI_DEBUG_LOG_ERROR(...) do { ImGuiContext& g2 = *GImGui; if (g2.DebugLogFlags & ImGuiDebugLogFlags_EventError) IMGUI_DEBUG_LOG(__VA_ARGS__); else g2.DebugLogSkippedErrors++; } while (0)
|
#define IMGUI_DEBUG_LOG_ERROR(...) do { ImGuiContext& g2 = *GImGui; if (g2.DebugLogFlags & ImGuiDebugLogFlags_EventError) IMGUI_DEBUG_LOG(__VA_ARGS__); else g2.DebugLogSkippedErrors++; } while (0)
|
||||||
#define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
#define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
||||||
#define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
#define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
||||||
@ -225,6 +220,7 @@ extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer
|
|||||||
#define IMGUI_DEBUG_LOG_SELECTION(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
#define IMGUI_DEBUG_LOG_SELECTION(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventSelection) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
||||||
#define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
#define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
||||||
#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
||||||
|
#define IMGUI_DEBUG_LOG_FONT(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFont) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
||||||
#define IMGUI_DEBUG_LOG_INPUTROUTING(...) do{if (g.DebugLogFlags & ImGuiDebugLogFlags_EventInputRouting)IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
#define IMGUI_DEBUG_LOG_INPUTROUTING(...) do{if (g.DebugLogFlags & ImGuiDebugLogFlags_EventInputRouting)IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0)
|
||||||
|
|
||||||
// Static Asserts
|
// Static Asserts
|
||||||
@ -760,10 +756,13 @@ IMGUI_API ImGuiStoragePair* ImLowerBound(ImGuiStoragePair* in_begin, ImGuiStorag
|
|||||||
#define IM_DRAWLIST_ARCFAST_SAMPLE_MAX IM_DRAWLIST_ARCFAST_TABLE_SIZE // Sample index _PathArcToFastEx() for 360 angle.
|
#define IM_DRAWLIST_ARCFAST_SAMPLE_MAX IM_DRAWLIST_ARCFAST_TABLE_SIZE // Sample index _PathArcToFastEx() for 360 angle.
|
||||||
|
|
||||||
// Data shared between all ImDrawList instances
|
// Data shared between all ImDrawList instances
|
||||||
// You may want to create your own instance of this if you want to use ImDrawList completely without ImGui. In that case, watch out for future changes to this structure.
|
// Conceptually this could have been called e.g. ImDrawListSharedContext
|
||||||
|
// Typically one ImGui context would create and maintain one of this.
|
||||||
|
// You may want to create your own instance of you try to ImDrawList completely without ImGui. In that case, watch out for future changes to this structure.
|
||||||
struct IMGUI_API ImDrawListSharedData
|
struct IMGUI_API ImDrawListSharedData
|
||||||
{
|
{
|
||||||
ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas
|
ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas
|
||||||
|
const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas
|
||||||
ImFont* Font; // Current/default font (optional, for simplified AddText overload)
|
ImFont* Font; // Current/default font (optional, for simplified AddText overload)
|
||||||
float FontSize; // Current/default font size (optional, for simplified AddText overload)
|
float FontSize; // Current/default font size (optional, for simplified AddText overload)
|
||||||
float FontScale; // Current/default font scale (== FontSize / Font->FontSize)
|
float FontScale; // Current/default font scale (== FontSize / Font->FontSize)
|
||||||
@ -779,7 +778,6 @@ struct IMGUI_API ImDrawListSharedData
|
|||||||
ImVec2 ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle.
|
ImVec2 ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle.
|
||||||
float ArcFastRadiusCutoff; // Cutoff radius after which arc drawing will fallback to slower PathArcTo()
|
float ArcFastRadiusCutoff; // Cutoff radius after which arc drawing will fallback to slower PathArcTo()
|
||||||
ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead)
|
ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead)
|
||||||
const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas
|
|
||||||
|
|
||||||
ImDrawListSharedData();
|
ImDrawListSharedData();
|
||||||
void SetCircleTessellationMaxError(float max_error);
|
void SetCircleTessellationMaxError(float max_error);
|
||||||
@ -1919,6 +1917,7 @@ typedef void (*ImGuiErrorCallback)(ImGuiContext* ctx, void* user_data, const cha
|
|||||||
// [SECTION] Metrics, Debug Tools
|
// [SECTION] Metrics, Debug Tools
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// See IMGUI_DEBUG_LOG() and IMGUI_DEBUG_LOG_XXX() macros.
|
||||||
enum ImGuiDebugLogFlags_
|
enum ImGuiDebugLogFlags_
|
||||||
{
|
{
|
||||||
// Event types
|
// Event types
|
||||||
@ -1931,11 +1930,12 @@ enum ImGuiDebugLogFlags_
|
|||||||
ImGuiDebugLogFlags_EventClipper = 1 << 5,
|
ImGuiDebugLogFlags_EventClipper = 1 << 5,
|
||||||
ImGuiDebugLogFlags_EventSelection = 1 << 6,
|
ImGuiDebugLogFlags_EventSelection = 1 << 6,
|
||||||
ImGuiDebugLogFlags_EventIO = 1 << 7,
|
ImGuiDebugLogFlags_EventIO = 1 << 7,
|
||||||
ImGuiDebugLogFlags_EventInputRouting = 1 << 8,
|
ImGuiDebugLogFlags_EventFont = 1 << 8,
|
||||||
ImGuiDebugLogFlags_EventDocking = 1 << 9, // Unused in this branch
|
ImGuiDebugLogFlags_EventInputRouting = 1 << 9,
|
||||||
ImGuiDebugLogFlags_EventViewport = 1 << 10, // Unused in this branch
|
ImGuiDebugLogFlags_EventDocking = 1 << 10, // Unused in this branch
|
||||||
|
ImGuiDebugLogFlags_EventViewport = 1 << 11, // Unused in this branch
|
||||||
|
|
||||||
ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventError | ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO | ImGuiDebugLogFlags_EventInputRouting | ImGuiDebugLogFlags_EventDocking | ImGuiDebugLogFlags_EventViewport,
|
ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventError | ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventSelection | ImGuiDebugLogFlags_EventIO | ImGuiDebugLogFlags_EventFont | ImGuiDebugLogFlags_EventInputRouting | ImGuiDebugLogFlags_EventDocking | ImGuiDebugLogFlags_EventViewport,
|
||||||
ImGuiDebugLogFlags_OutputToTTY = 1 << 20, // Also send output to TTY
|
ImGuiDebugLogFlags_OutputToTTY = 1 << 20, // Also send output to TTY
|
||||||
ImGuiDebugLogFlags_OutputToTestEngine = 1 << 21, // Also send output to Test Engine
|
ImGuiDebugLogFlags_OutputToTestEngine = 1 << 21, // Also send output to Test Engine
|
||||||
};
|
};
|
||||||
@ -3524,7 +3524,8 @@ namespace ImGui
|
|||||||
// [SECTION] ImFontAtlas internal API
|
// [SECTION] ImFontAtlas internal API
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
// This structure is likely to evolve as we add support for incremental atlas updates
|
// This structure is likely to evolve as we add support for incremental atlas updates.
|
||||||
|
// Conceptually this could be in ImGuiPlatformIO, but we are far from ready to make this public.
|
||||||
struct ImFontBuilderIO
|
struct ImFontBuilderIO
|
||||||
{
|
{
|
||||||
bool (*FontBuilder_Build)(ImFontAtlas* atlas);
|
bool (*FontBuilder_Build)(ImFontAtlas* atlas);
|
||||||
|
@ -169,6 +169,7 @@ namespace
|
|||||||
const FT_Glyph_Metrics* LoadGlyph(uint32_t in_codepoint);
|
const FT_Glyph_Metrics* LoadGlyph(uint32_t in_codepoint);
|
||||||
const FT_Bitmap* RenderGlyphAndGetInfo(GlyphInfo* out_glyph_info);
|
const FT_Bitmap* RenderGlyphAndGetInfo(GlyphInfo* out_glyph_info);
|
||||||
void BlitGlyph(const FT_Bitmap* ft_bitmap, uint32_t* dst, uint32_t dst_pitch, unsigned char* multiply_table = nullptr);
|
void BlitGlyph(const FT_Bitmap* ft_bitmap, uint32_t* dst, uint32_t dst_pitch, unsigned char* multiply_table = nullptr);
|
||||||
|
FreeTypeFont() { memset(this, 0, sizeof(*this)); }
|
||||||
~FreeTypeFont() { CloseFont(); }
|
~FreeTypeFont() { CloseFont(); }
|
||||||
|
|
||||||
// [Internals]
|
// [Internals]
|
||||||
|
Loading…
Reference in New Issue
Block a user