(TO REMOVE) Demo: rename GetCustomRectByIndex() -> GetCustomRect(). add custom rect with Image().
diff --git a/imgui_demo.cpp b/imgui_demo.cpp index 428257d..643f9bd 100644 --- a/imgui_demo.cpp +++ b/imgui_demo.cpp
@@ -364,8 +364,8 @@ float RasterizerMultiply = 1.0f; float RasterizerDensity = 1.0f; float PackNodesFactor = 1.0f; - int FreeTypeBuilderFlags = 0; ImVector<int> CustomRects; + int CustomRectImage = -1; }; static FontDemoData GFontDemoData; @@ -386,8 +386,8 @@ #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS ImFontAtlas* atlas = font->ContainerAtlas; const float square_size = font_size * 0.50f; - const int r_idx = atlas->AddCustomRectFontGlyphForSize(font, font_size, codepoint, (int)square_size, (int)square_size, square_size, { 0, font_size - square_size }); - const ImTextureRect* r = atlas->GetCustomRectByIndex(r_idx); + const int r_id = atlas->AddCustomRectFontGlyphForSize(font, font_size, codepoint, (int)square_size, (int)square_size, square_size, { 0, font_size - square_size }); + const ImTextureRect* r = atlas->GetCustomRect(r_id); unsigned char* pixels = atlas->TexData->GetPixelsAt(r->x, r->y); for (int y = 0; y < r->h; y++) { @@ -408,10 +408,13 @@ void LoadFonts(float scale) { ImGuiIO& io = ImGui::GetIO(); - //ImFontAtlas* atlas = io.Fonts; + ImFontAtlas* atlas = io.Fonts; + + // Test adding a custom rect + //atlas->AddCustomRectRegular(100, 100); // (1) - ImFont* font = io.Fonts->AddFontFromFileTTF("../../../fonts/NotoSans-Regular.ttf", 16.0f * scale); + ImFont* font = atlas->AddFontFromFileTTF("../../../fonts/NotoSans-Regular.ttf", 16.0f * scale); IM_UNUSED(font); { @@ -422,43 +425,43 @@ #ifdef IMGUI_ENABLE_FREETYPE cfg.FontBuilderFlags |= ImGuiFreeTypeBuilderFlags_LoadColor; #endif - io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\seguiemj.ttf", 16.0f * scale, &cfg);// , ranges); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/NotoColorEmoji.ttf", 16.0f, &cfg, ranges); + atlas->AddFontFromFileTTF("C:\\Windows\\Fonts\\seguiemj.ttf", 16.0f * scale, &cfg);// , ranges); + //atlas->AddFontFromFileTTF("../../misc/fonts/NotoColorEmoji.ttf", 16.0f, &cfg, ranges); } { ImFontConfig cfg; cfg.MergeMode = true; - io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 16.0f * scale, &cfg); + atlas->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 16.0f * scale, &cfg); } // (2) { ImFontConfig cfg_main; //cfg.OversampleH = 1; - ImFont* font_main = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f * scale, &cfg_main); + ImFont* font_main = atlas->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f * scale, &cfg_main); IM_UNUSED(font_main); ImFontConfig cfg_icon; cfg_icon.MergeMode = true; cfg_icon.OversampleH = 1; - ImFont* font_icon = io.Fonts->AddFontFromFileTTF("../../../fonts/fa-solid-900.ttf", 18.0f * scale, &cfg_icon); + ImFont* font_icon = atlas->AddFontFromFileTTF("../../../fonts/fa-solid-900.ttf", 18.0f * scale, &cfg_icon); IM_UNUSED(font_icon); } - io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 17.0f * scale);// , nullptr, io.Fonts->GetGlyphRangesJapanese()); + atlas->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 17.0f * scale);// , nullptr, atlas->GetGlyphRangesJapanese()); - io.Fonts->AddFontDefault(); + atlas->AddFontDefault(); - ImFont* roboto = io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f * scale); + ImFont* roboto = atlas->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f * scale); IM_UNUSED(roboto); #if 0 // Test ImFontFlags_LockBakedSizes roboto->GetFontBaked(16.0f * scale); roboto->Flags |= ImFontFlags_LockBakedSizes; #endif - io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f * scale); - io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f * scale); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f * scale); + atlas->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f * scale); + atlas->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f * scale); + //atlas->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f * scale); #ifdef IMGUI_ENABLE_FREETYPE_LUNASVG { @@ -466,7 +469,7 @@ static ImWchar full_ranges[] = { 1, 0xFFFFF, 0 }; //cfg.OversampleH = cfg.OversampleV = 1; cfg.FontBuilderFlags |= ImGuiFreeTypeBuilderFlags_LoadColor; - io.Fonts->AddFontFromFileTTF("../../../fonts/TwitterColorEmoji-SVGinOT.ttf", 16.0f * scale, &cfg, full_ranges); + atlas->AddFontFromFileTTF("../../../fonts/TwitterColorEmoji-SVGinOT.ttf", 16.0f * scale, &cfg, full_ranges); } #endif @@ -476,6 +479,7 @@ void LoadProceduralFont(float scale) { ImGuiIO& io = ImGui::GetIO(); + static ImFontLoader custom_loader; custom_loader.Name = "Procedural"; custom_loader.FontSrcContainsGlyph = [](ImFontAtlas* atlas, ImFontConfig* src, ImWchar codepoint) @@ -501,7 +505,7 @@ #endif ImFontAtlasRectId pack_id = ImFontAtlasPackAddRect(atlas, w, h); - ImFontAtlasRect* r = ImFontAtlasPackGetRect(atlas, pack_id); + ImTextureRect* r = ImFontAtlasPackGetRect(atlas, pack_id); ImFontGlyph glyph_in = {}; ImFontGlyph* glyph = &glyph_in; @@ -543,7 +547,7 @@ ImFontConfig font_noto; //strcpy(font_noto.Name, "procedural"); //font_noto.MergeMode = true; - //io.Fonts->AddFontFromFileTTF("../../../fonts/NotoSans-Regular.ttf", 20.0f * scale, &font_noto); + //atlas->AddFontFromFileTTF("../../../fonts/NotoSans-Regular.ttf", 20.0f * scale, &font_noto); ImFontConfig empty_font; strcpy(empty_font.Name, "procedural"); @@ -736,11 +740,35 @@ // Toy with legacy AddCustomRectXXX api if (ImGui::TreeNode("Custom Rect API")) { + if (ImGui::Button("Add Image")) + { + data->CustomRectImage = atlas->AddCustomRectRegular(200, 200); + const ImTextureRect* r = atlas->GetCustomRect(data->CustomRectImage); + unsigned char* pixels = atlas->TexData->GetPixelsAt(r->x, r->y); + for (int y = 0; y < r->h; y++) + { + for (int x = 0; x < r->w; x++) + { + float d = ImSqrt(ImLengthSqr({ ImFabs(r->w * 0.5f - x), ImFabs(r->h * 0.5f - y) })); + int alpha = (int)ImLinearRemapClamp(80, 95, 255, 0, d); + ((ImU32*)pixels)[x] = IM_COL32(120, 255, 120, alpha); + } + pixels += atlas->TexData->GetPitch(); + } + } + if (data->CustomRectImage != -1) + { + const ImTextureRect* r = atlas->GetCustomRect(data->CustomRectImage); + ImVec2 uv0, uv1; + atlas->GetCustomRectUV(r, &uv0, &uv1); + ImGui::Image(atlas->TexID, ImVec2(r->w, r->h), uv0, uv1); + } + ImGui::PushItemFlag(ImGuiItemFlags_ButtonRepeat, true); if (ImGui::Button("Add Custom Rect")) { - const int r_idx = atlas->AddCustomRectRegular(10, 10); - const ImTextureRect* r = atlas->GetCustomRectByIndex(r_idx); + const int r_id = atlas->AddCustomRectRegular(10, 10); + const ImTextureRect* r = atlas->GetCustomRect(r_id); unsigned char* pixels = atlas->TexData->GetPixelsAt(r->x, r->y); ImU32 col = 0; @@ -751,7 +779,7 @@ case 2: col = IM_COL32(0, 0, 255, 255); break; case 3: col = IM_COL32(255, 0, 255, 255); break; } - data->CustomRects.push_back(r_idx); + data->CustomRects.push_back(r_id); for (int y = 0; y < r->h; y++) { for (int x = 0; x < r->w; x++) @@ -765,9 +793,9 @@ } for (int r_idx : data->CustomRects) { - const ImTextureRect* r = atlas->GetCustomRectByIndex(r_idx); + const ImTextureRect* r = atlas->GetCustomRect(r_idx); ImVec2 uv_min, uv_max; - atlas->CalcCustomRectUV(r, &uv_min, &uv_max); + atlas->GetCustomRectUV(r, &uv_min, &uv_max); ImGui::BulletText("CustomRect id %04d", r_idx); ImGui::SameLine(); ImGui::Image(atlas->TexID, ImVec2(r->w, r->h), uv_min, uv_max); @@ -777,23 +805,6 @@ ImGui::TreePop(); } -#ifdef IMGUI_ENABLE_FREETYPE - if (ImGui::TreeNode("FreeType Builder Flags")) - { - want_rebuild |= ImGui::CheckboxFlags("NoHinting", &data->FreeTypeBuilderFlags, ImGuiFreeTypeBuilderFlags_NoHinting); - want_rebuild |= ImGui::CheckboxFlags("NoAutoHint", &data->FreeTypeBuilderFlags, ImGuiFreeTypeBuilderFlags_NoAutoHint); - want_rebuild |= ImGui::CheckboxFlags("ForceAutoHint", &data->FreeTypeBuilderFlags, ImGuiFreeTypeBuilderFlags_ForceAutoHint); - want_rebuild |= ImGui::CheckboxFlags("LightHinting", &data->FreeTypeBuilderFlags, ImGuiFreeTypeBuilderFlags_LightHinting); - want_rebuild |= ImGui::CheckboxFlags("MonoHinting", &data->FreeTypeBuilderFlags, ImGuiFreeTypeBuilderFlags_MonoHinting); - want_rebuild |= ImGui::CheckboxFlags("Bold", &data->FreeTypeBuilderFlags, ImGuiFreeTypeBuilderFlags_Bold); - want_rebuild |= ImGui::CheckboxFlags("Oblique", &data->FreeTypeBuilderFlags, ImGuiFreeTypeBuilderFlags_Oblique); - want_rebuild |= ImGui::CheckboxFlags("Monochrome", &data->FreeTypeBuilderFlags, ImGuiFreeTypeBuilderFlags_Monochrome); - want_rebuild |= ImGui::CheckboxFlags("LoadColor", &data->FreeTypeBuilderFlags, ImGuiFreeTypeBuilderFlags_LoadColor); - want_rebuild |= ImGui::CheckboxFlags("Bitmap", &data->FreeTypeBuilderFlags, ImGuiFreeTypeBuilderFlags_Bitmap); - ImGui::TreePop(); - } -#endif - ImGui::Separator(); if (want_rebuild) @@ -809,18 +820,18 @@ #ifdef IMGUI_ENABLE_STB_TRUETYPE if (data->BuildMode == FontDemoBuildMode_Stb) { - atlas->FontBuilderFlags = 0; + ImFontAtlasBuildSetupFontLoader(atlas, NULL); ImFontAtlasBuildSetupFontLoader(atlas, ImFontAtlasGetFontLoaderForStbTruetype()); } #endif #ifdef IMGUI_ENABLE_FREETYPE if (data->BuildMode == FontDemoBuildMode_FreeType) { - atlas->FontBuilderFlags = data->FreeTypeBuilderFlags; + ImFontAtlasBuildSetupFontLoader(atlas, NULL); ImFontAtlasBuildSetupFontLoader(atlas, ImGuiFreeType::GetFontLoader()); } #endif - ImFontAtlasBuildClearTexture(atlas); + //ImFontAtlasBuildClearTexture(atlas); data->CustomRects.clear(); } @@ -832,6 +843,10 @@ ::Sleep(500); #endif + ImGui::ShowFontAtlas(atlas); + + /* + ImGui::SameLine(); if (ImGui::Button("Compact")) atlas->CompactCache(); @@ -854,7 +869,7 @@ } ImGui::SetNextItemOpen(true, ImGuiCond_Once); - ImGui::DebugNodeTexture(atlas->TexData); + ImGui::DebugNodeTexture(atlas->TexData, 0); //{ // ImTextureData* tex = atlas->TexData; // ImGui::Image(atlas->TexID, ImVec2((float)tex->Width, (float)tex->Height), { 0,0 }, { 1,1 }, { 1,1,1,1 }, { 0.5f, 0.5f, 0.5f, 1.0f }); @@ -863,6 +878,7 @@ //const int surface_sqrt = (int)sqrtf((float)atlas->_PackedSurface); //ImGui::Text("Used area: about %d px ~%dx%d px", atlas->_PackedSurface, surface_sqrt, surface_sqrt); //ImGui::Text("Packed %d rects", atlas->_PackedRects); + */ ImGui::End();