瀏覽代碼

Mde it optional to new() io.Font - however it stills needs to be loaded.

ocornut 10 年之前
父節點
當前提交
241e8086fa

+ 0 - 1
examples/directx11_example/main.cpp

@@ -465,7 +465,6 @@ void InitImGui()
     }
 
     // Load font
-    io.Font = new ImFont();
     io.Font->LoadDefault();
     //io.Font->LoadFromFileTTF("myfont.ttf", font_size_px, ImFont::GetGlyphRangesDefault());
     //io.Font->DisplayOffset.y += 0.0f;

+ 0 - 1
examples/directx9_example/main.cpp

@@ -238,7 +238,6 @@ void InitImGui()
     }
 
     // Load font
-    io.Font = new ImFont();
     io.Font->LoadDefault();
     //io.Font->LoadFromFileTTF("myfont.ttf", font_size_px, ImFont::GetGlyphRangesDefault());
     //io.Font->DisplayOffset.y += 0.0f;

+ 0 - 1
examples/opengl3_example/main.cpp

@@ -278,7 +278,6 @@ void InitImGui()
     io.GetClipboardTextFn = ImImpl_GetClipboardTextFn;
 
     // Load font
-    io.Font = new ImFont();
     io.Font->LoadDefault();
     //io.Font->LoadFromFileTTF("myfont.ttf", font_size_px, ImFont::GetGlyphRangesDefault());
     //io.Font->DisplayOffset.y += 0.0f;

+ 0 - 1
examples/opengl_example/main.cpp

@@ -187,7 +187,6 @@ void InitImGui()
     io.GetClipboardTextFn = ImImpl_GetClipboardTextFn;
 
     // Load font
-    io.Font = new ImFont();
     io.Font->LoadDefault();
     //io.Font->LoadFromFileTTF("myfont.ttf", font_size_px, ImFont::GetGlyphRangesDefault());
     //io.Font->DisplayOffset.y += 0.0f;

+ 17 - 8
imgui.cpp

@@ -417,6 +417,12 @@ ImGuiStyle::ImGuiStyle()
     Colors[ImGuiCol_TooltipBg]              = ImVec4(0.05f, 0.05f, 0.10f, 0.90f);
 }
 
+// We statically allocate a default font storage for the user.
+// This allows the user to avoid newing the default font, while keeping IO.Font a pointer which is easy to swap if needed.
+// We cannot new() the font because user may override MemAllocFn after the ImGuiIO() constructor is called.
+// For the same reason we cannot call LoadDefault() on the font.
+static ImFont GDefaultStaticFont;
+
 ImGuiIO::ImGuiIO()
 {
     memset(this, 0, sizeof(*this));
@@ -425,7 +431,7 @@ ImGuiIO::ImGuiIO()
     IniSavingRate = 5.0f;
     IniFilename = "imgui.ini";
     LogFilename = "imgui_log.txt";
-    Font = NULL;
+    Font = &GDefaultStaticFont;
     FontGlobalScale = 1.0f;
     FontAllowUserScaling = false;
     PixelCenterOffset = 0.0f;
@@ -1663,8 +1669,11 @@ void ImGui::Shutdown()
     }
     if (g.IO.Font)
     {
-        g.IO.Font->~ImFont();
-        ImGui::MemFree(g.IO.Font);
+        if (g.IO.Font != &GDefaultStaticFont)
+        {
+            g.IO.Font->~ImFont();
+            ImGui::MemFree(g.IO.Font);
+        }
         g.IO.Font = NULL;
     }
 
@@ -6146,9 +6155,9 @@ void ImDrawList::AddText(ImFont* font, float font_size, const ImVec2& pos, ImU32
     if (text_end == NULL)
         text_end = text_begin + strlen(text_begin);
 
-	const bool push_texture_id = font->TexID != texture_id_stack.back();
-	if (push_texture_id)
-		PushTextureID(font->TexID);
+    const bool push_texture_id = font->TexID != texture_id_stack.back();
+    if (push_texture_id)
+        PushTextureID(font->TexID);
 
     // reserve vertices for worse case
     const unsigned int char_count = (unsigned int)(text_end - text_begin);
@@ -6164,8 +6173,8 @@ void ImDrawList::AddText(ImFont* font, float font_size, const ImVec2& pos, ImU32
     commands.back().vtx_count -= (unsigned int)(vtx_count_max - vtx_count);
     vtx_write -= (vtx_count_max - vtx_count);
 
-	if (push_texture_id)
-		PopTextureID();
+    if (push_texture_id)
+        PopTextureID();
 }
 
 void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv0, const ImVec2& uv1, ImU32 col)

+ 4 - 3
imgui.h

@@ -746,14 +746,15 @@ struct ImFont
     float               Scale;              // = 1.0f          // Base font scale, multiplied by the per-window font scale which you can adjust with SetFontScale()
     ImVec2              DisplayOffset;      // = (0.0f,0.0f)   // Offset font rendering by xx pixels
     ImWchar             FallbackChar;       // = '?'           // Replacement glyph if one isn't found.
-    ImTextureID         TexID;              // = NULL          // User reference to texture used by the font (ignore if you aren't using multiple fonts/textures)
 
-    // Texture data
-    // User is in charge of copying the pixels into a GPU texture. 
+    // Texture data: user is in charge of copying the pixels into a GPU texture. 
     // You can set 'TexID' to uniquely identify your texture. TexId is copied to the ImDrawCmd structure which you receive during rendering.
+    ImTextureID         TexID;              // User reference to texture used by the font (ignore if you aren't using multiple fonts/textures)
     unsigned char*      TexPixels;          // 1 byte, 1 component per pixel. Total byte size of TexWidth * TexHeight
     int                 TexWidth;
     int                 TexHeight;
+
+    // [Internal]
     ImVec2              TexExtraDataPos;    // Position of our rectangle where we draw non-font graphics
     ImVec2              TexUvWhitePixel;    // Texture coordinates to a white pixel (part of the TexExtraData block)