diff --git a/extern/imgui_patched/backends/imgui_impl_dx11.cpp b/extern/imgui_patched/backends/imgui_impl_dx11.cpp index 764b91e86..d4bc7fa06 100644 --- a/extern/imgui_patched/backends/imgui_impl_dx11.cpp +++ b/extern/imgui_patched/backends/imgui_impl_dx11.cpp @@ -701,7 +701,7 @@ void ImGui_ImplDX11_Shutdown() IM_DELETE(bd); } -bool ImGui_ImplDX11_NewFrame() +void ImGui_ImplDX11_NewFrame() { ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplDX11_Init()?"); diff --git a/extern/imgui_patched/backends/imgui_impl_dx11.h b/extern/imgui_patched/backends/imgui_impl_dx11.h index 1ab5b42e8..6f7798d76 100644 --- a/extern/imgui_patched/backends/imgui_impl_dx11.h +++ b/extern/imgui_patched/backends/imgui_impl_dx11.h @@ -28,7 +28,7 @@ struct ID3D11Buffer; // Follow "Getting Started" link and check examples/ folder to learn about using backends! IMGUI_IMPL_API bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context); IMGUI_IMPL_API void ImGui_ImplDX11_Shutdown(); -IMGUI_IMPL_API bool ImGui_ImplDX11_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplDX11_NewFrame(); IMGUI_IMPL_API void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data); // Use if you want to reset your rendering device without losing Dear ImGui state. diff --git a/extern/imgui_patched/backends/imgui_impl_dx9.cpp b/extern/imgui_patched/backends/imgui_impl_dx9.cpp index 8cc3ad386..5c6fdc509 100644 --- a/extern/imgui_patched/backends/imgui_impl_dx9.cpp +++ b/extern/imgui_patched/backends/imgui_impl_dx9.cpp @@ -499,7 +499,7 @@ void ImGui_ImplDX9_InvalidateDeviceObjects() ImGui_ImplDX9_InvalidateDeviceObjectsForPlatformWindows(); } -bool ImGui_ImplDX9_NewFrame() +void ImGui_ImplDX9_NewFrame() { ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplDX9_Init()?"); diff --git a/extern/imgui_patched/backends/imgui_impl_dx9.h b/extern/imgui_patched/backends/imgui_impl_dx9.h index 481f3c35f..09f1d30de 100644 --- a/extern/imgui_patched/backends/imgui_impl_dx9.h +++ b/extern/imgui_patched/backends/imgui_impl_dx9.h @@ -25,7 +25,7 @@ struct IDirect3DDevice9; // Follow "Getting Started" link and check examples/ folder to learn about using backends! IMGUI_IMPL_API bool ImGui_ImplDX9_Init(IDirect3DDevice9* device); IMGUI_IMPL_API void ImGui_ImplDX9_Shutdown(); -IMGUI_IMPL_API bool ImGui_ImplDX9_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplDX9_NewFrame(); IMGUI_IMPL_API void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data); // Use if you want to reset your rendering device without losing Dear ImGui state. diff --git a/extern/imgui_patched/backends/imgui_impl_metal.h b/extern/imgui_patched/backends/imgui_impl_metal.h index 67cbb7a3b..430bba8f0 100644 --- a/extern/imgui_patched/backends/imgui_impl_metal.h +++ b/extern/imgui_patched/backends/imgui_impl_metal.h @@ -31,7 +31,7 @@ // Follow "Getting Started" link and check examples/ folder to learn about using backends! IMGUI_IMPL_API bool ImGui_ImplMetal_Init(id device); IMGUI_IMPL_API void ImGui_ImplMetal_Shutdown(); -IMGUI_IMPL_API bool ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor); +IMGUI_IMPL_API void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor); IMGUI_IMPL_API void ImGui_ImplMetal_RenderDrawData(ImDrawData* drawData, id commandBuffer, id commandEncoder); @@ -59,7 +59,7 @@ IMGUI_IMPL_API void ImGui_ImplMetal_UpdateTexture(ImTextureData* tex); // Follow "Getting Started" link and check examples/ folder to learn about using backends! IMGUI_IMPL_API bool ImGui_ImplMetal_Init(MTL::Device* device); IMGUI_IMPL_API void ImGui_ImplMetal_Shutdown(); -IMGUI_IMPL_API bool ImGui_ImplMetal_NewFrame(MTL::RenderPassDescriptor* renderPassDescriptor); +IMGUI_IMPL_API void ImGui_ImplMetal_NewFrame(MTL::RenderPassDescriptor* renderPassDescriptor); IMGUI_IMPL_API void ImGui_ImplMetal_RenderDrawData(ImDrawData* draw_data, MTL::CommandBuffer* commandBuffer, MTL::RenderCommandEncoder* commandEncoder); diff --git a/extern/imgui_patched/backends/imgui_impl_metal.mm b/extern/imgui_patched/backends/imgui_impl_metal.mm index 39fcabf2c..85d2e2f08 100644 --- a/extern/imgui_patched/backends/imgui_impl_metal.mm +++ b/extern/imgui_patched/backends/imgui_impl_metal.mm @@ -169,7 +169,7 @@ void ImGui_ImplMetal_Shutdown() io.BackendFlags &= ~(ImGuiBackendFlags_RendererHasVtxOffset | ImGuiBackendFlags_RendererHasTextures | ImGuiBackendFlags_RendererHasViewports); } -bool ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor) +void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor) { ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData(); IM_ASSERT(bd != nil && "Context or backend not initialized! Did you call ImGui_ImplMetal_Init()?"); @@ -183,9 +183,7 @@ bool ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor) bd->SharedMetalContext.framebufferDescriptor = [[FramebufferDescriptor alloc] initWithRenderPassDescriptor:renderPassDescriptor]; #endif if (bd->SharedMetalContext.depthStencilState == nil) - return ImGui_ImplMetal_CreateDeviceObjects(bd->SharedMetalContext.device); - - return true; + ImGui_ImplMetal_CreateDeviceObjects(bd->SharedMetalContext.device); } static void ImGui_ImplMetal_SetupRenderState(ImDrawData* draw_data, id commandBuffer, diff --git a/extern/imgui_patched/backends/imgui_impl_opengl2.cpp b/extern/imgui_patched/backends/imgui_impl_opengl2.cpp index 42f6ce6d2..76ef497bf 100644 --- a/extern/imgui_patched/backends/imgui_impl_opengl2.cpp +++ b/extern/imgui_patched/backends/imgui_impl_opengl2.cpp @@ -132,7 +132,7 @@ void ImGui_ImplOpenGL2_Shutdown() IM_DELETE(bd); } -bool ImGui_ImplOpenGL2_NewFrame() +void ImGui_ImplOpenGL2_NewFrame() { ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData(); IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplOpenGL2_Init()?"); diff --git a/extern/imgui_patched/backends/imgui_impl_opengl2.h b/extern/imgui_patched/backends/imgui_impl_opengl2.h index 64d2f8d0b..def65c8d9 100644 --- a/extern/imgui_patched/backends/imgui_impl_opengl2.h +++ b/extern/imgui_patched/backends/imgui_impl_opengl2.h @@ -31,7 +31,7 @@ // Follow "Getting Started" link and check examples/ folder to learn about using backends! IMGUI_IMPL_API bool ImGui_ImplOpenGL2_Init(); IMGUI_IMPL_API void ImGui_ImplOpenGL2_Shutdown(); -IMGUI_IMPL_API bool ImGui_ImplOpenGL2_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplOpenGL2_NewFrame(); IMGUI_IMPL_API void ImGui_ImplOpenGL2_RenderDrawData(ImDrawData* draw_data); // Called by Init/NewFrame/Shutdown diff --git a/extern/imgui_patched/backends/imgui_impl_opengl3.cpp b/extern/imgui_patched/backends/imgui_impl_opengl3.cpp index 00464ea6e..da95969b8 100644 --- a/extern/imgui_patched/backends/imgui_impl_opengl3.cpp +++ b/extern/imgui_patched/backends/imgui_impl_opengl3.cpp @@ -440,12 +440,11 @@ void ImGui_ImplOpenGL3_Shutdown() IM_DELETE(bd); } -bool ImGui_ImplOpenGL3_NewFrame() +void ImGui_ImplOpenGL3_NewFrame() { ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplOpenGL3_Init()?"); - bool ret=true; ImGui_ImplOpenGL3_InitLoader(); // Lazily init loader if not already done for e.g. DLL boundaries. if (!bd->ShaderHandle) @@ -1028,7 +1027,7 @@ bool ImGui_ImplOpenGL3_CreateDeviceObjects() glBindVertexArray(last_vertex_array); #endif - return whatReturn; + return true; } void ImGui_ImplOpenGL3_DestroyDeviceObjects() diff --git a/extern/imgui_patched/backends/imgui_impl_opengl3.h b/extern/imgui_patched/backends/imgui_impl_opengl3.h index a94e90966..9495d4e97 100644 --- a/extern/imgui_patched/backends/imgui_impl_opengl3.h +++ b/extern/imgui_patched/backends/imgui_impl_opengl3.h @@ -34,7 +34,7 @@ // Follow "Getting Started" link and check examples/ folder to learn about using backends! IMGUI_IMPL_API bool ImGui_ImplOpenGL3_Init(const char* glsl_version = nullptr); IMGUI_IMPL_API void ImGui_ImplOpenGL3_Shutdown(); -IMGUI_IMPL_API bool ImGui_ImplOpenGL3_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplOpenGL3_NewFrame(); IMGUI_IMPL_API void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data); // (Optional) Called by Init/NewFrame/Shutdown diff --git a/extern/imgui_patched/backends/imgui_impl_sdl2.cpp b/extern/imgui_patched/backends/imgui_impl_sdl2.cpp index b064cb8be..e6ac46972 100644 --- a/extern/imgui_patched/backends/imgui_impl_sdl2.cpp +++ b/extern/imgui_patched/backends/imgui_impl_sdl2.cpp @@ -988,7 +988,7 @@ static void ImGui_ImplSDL2_UpdateMonitors() } } -static void ImGui_ImplSDL2_GetWindowSizeAndFramebufferScale(SDL_Window* window, SDL_Renderer* renderer, ImVec2* out_size, ImVec2* out_framebuffer_scale) +static void ImGui_ImplSDL2_GetWindowSizeAndFramebufferScale(SDL_Window* window, SDL_Renderer* renderer, ImVec2* out_size, ImVec2* out_framebuffer_scale, int* out_w, int* out_h, int* out_display_w, int* out_display_h) { int w, h; int display_w, display_h; @@ -1007,10 +1007,11 @@ static void ImGui_ImplSDL2_GetWindowSizeAndFramebufferScale(SDL_Window* window, #endif else SDL_GL_GetDrawableSize(window, &display_w, &display_h); - if (out_size != nullptr) + // tildearrow: don't set the size if it is 0 + if (out_size != nullptr && w > 0 && h > 0) *out_size = ImVec2((float)w, (float)h); // tildearrow: TODO: good idea? - if (out_framebuffer_scale != nullptr) + if (out_framebuffer_scale != nullptr && w > 0 && h > 0) *out_framebuffer_scale = (w > 0 && h > 0) ? ImVec2((float)display_w / w, (float)display_h / h) : ImVec2(1.0f, 1.0f); } @@ -1020,13 +1021,13 @@ void ImGui_ImplSDL2_NewFrame() IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplSDL2_Init()?"); ImGuiIO& io = ImGui::GetIO(); - // Setup main viewport size (every frame to accommodate for window resizing) - ImGui_ImplSDL2_GetWindowSizeAndFramebufferScale(bd->Window, bd->Renderer, &io.DisplaySize, &io.DisplayFramebufferScale); + // tildearrow + int w=0, h=0; + int display_w=0, display_h=0; + + // Setup main viewport size (every frame to accommodate for window resizing) + ImGui_ImplSDL2_GetWindowSizeAndFramebufferScale(bd->Window, bd->Renderer, &io.DisplaySize, &io.DisplayFramebufferScale, &w, &h, &display_w, &display_h); - if (w > 0 && h > 0) { - io.DisplaySize = ImVec2((float)w, (float)h); - io.DisplayFramebufferScale = ImVec2((float)display_w / w, (float)display_h / h); - } // TODO: is this before, or after? // Update monitors @@ -1228,7 +1229,7 @@ static ImVec2 ImGui_ImplSDL2_GetWindowFramebufferScale(ImGuiViewport* viewport) // FIXME: SDL_Renderer does not support multi-viewport. ImGui_ImplSDL2_ViewportData* vd = (ImGui_ImplSDL2_ViewportData*)viewport->PlatformUserData; ImVec2 framebuffer_scale; - ImGui_ImplSDL2_GetWindowSizeAndFramebufferScale(vd->Window, nullptr, nullptr, &framebuffer_scale); + ImGui_ImplSDL2_GetWindowSizeAndFramebufferScale(vd->Window, nullptr, nullptr, &framebuffer_scale, NULL, NULL, NULL, NULL); return framebuffer_scale; } diff --git a/extern/imgui_patched/backends/imgui_impl_sdlrenderer2.cpp b/extern/imgui_patched/backends/imgui_impl_sdlrenderer2.cpp index d0195bb94..d1959cd6b 100644 --- a/extern/imgui_patched/backends/imgui_impl_sdlrenderer2.cpp +++ b/extern/imgui_patched/backends/imgui_impl_sdlrenderer2.cpp @@ -113,7 +113,7 @@ static void ImGui_ImplSDLRenderer2_SetupRenderState(SDL_Renderer* renderer) SDL_RenderSetClipRect(renderer, nullptr); } -bool ImGui_ImplSDLRenderer2_NewFrame() +void ImGui_ImplSDLRenderer2_NewFrame() { ImGui_ImplSDLRenderer2_Data* bd = ImGui_ImplSDLRenderer2_GetBackendData(); IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplSDLRenderer2_Init()?"); diff --git a/extern/imgui_patched/backends/imgui_impl_sdlrenderer2.h b/extern/imgui_patched/backends/imgui_impl_sdlrenderer2.h index 9af280aee..3d8de5fad 100644 --- a/extern/imgui_patched/backends/imgui_impl_sdlrenderer2.h +++ b/extern/imgui_patched/backends/imgui_impl_sdlrenderer2.h @@ -34,7 +34,7 @@ struct SDL_Renderer; // Follow "Getting Started" link and check examples/ folder to learn about using backends! IMGUI_IMPL_API bool ImGui_ImplSDLRenderer2_Init(SDL_Renderer* renderer); IMGUI_IMPL_API void ImGui_ImplSDLRenderer2_Shutdown(); -IMGUI_IMPL_API bool ImGui_ImplSDLRenderer2_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplSDLRenderer2_NewFrame(); IMGUI_IMPL_API void ImGui_ImplSDLRenderer2_RenderDrawData(ImDrawData* draw_data, SDL_Renderer* renderer); // Called by Init/NewFrame/Shutdown diff --git a/extern/imgui_software_renderer/imgui_sw.cpp b/extern/imgui_software_renderer/imgui_sw.cpp index 0dcf1a5fe..a7471e49a 100644 --- a/extern/imgui_software_renderer/imgui_sw.cpp +++ b/extern/imgui_software_renderer/imgui_sw.cpp @@ -17,7 +17,6 @@ struct ImGui_ImplSW_Data { SDL_Window* Window; - SWTexture* FontTexture; ImGui_ImplSW_Data() { memset((void*)this, 0, sizeof(*this)); } }; @@ -537,7 +536,7 @@ static void paint_draw_cmd(const PaintTarget &target, const ImDrawCmd &pcmd, const ImVec2& white_uv) { - const SWTexture* texture = (const SWTexture*)(pcmd.TextureId); + const SWTexture* texture = (const SWTexture*)(pcmd.GetTexID()); IM_ASSERT(texture); for (unsigned int i = 0; i + 3 <= pcmd.ElemCount;) { @@ -647,7 +646,7 @@ static void paint_imgui(uint32_t *pixels, ImDrawData *drawData, int fb_width, in bool ImGui_ImplSW_Init(SDL_Window* win) { ImGuiIO& io = ImGui::GetIO(); - ImGuiIO& platform_io = ImGui::GetPlatformIO(); + ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO(); IM_ASSERT(io.BackendRendererUserData == nullptr); if (SDL_HasWindowSurface(win)==SDL_FALSE) { @@ -677,17 +676,22 @@ void ImGui_ImplSW_Shutdown() { IM_DELETE(bd); } -bool ImGui_ImplSW_NewFrame() { +void ImGui_ImplSW_NewFrame() { ImGui_ImplSW_Data* bd = ImGui_ImplSW_GetBackendData(); IM_ASSERT(bd != nullptr); - - return true; } void ImGui_ImplSW_RenderDrawData(ImDrawData* draw_data) { ImGui_ImplSW_Data* bd = ImGui_ImplSW_GetBackendData(); IM_ASSERT(bd != nullptr); + // update textures if needed + if (draw_data->Textures!=NULL) { + for (ImTextureData* i: *draw_data->Textures) { + if (i->Status!=ImTextureStatus_OK) ImGui_ImplSW_UpdateTexture(i); + } + } + SDL_Surface* surf = SDL_GetWindowSurface(bd->Window); if (!surf) return; @@ -704,38 +708,84 @@ void ImGui_ImplSW_RenderDrawData(ImDrawData* draw_data) { /// CREATE OBJECTS -bool ImGui_ImplSW_CreateFontsTexture() { - ImGuiIO &io = ImGui::GetIO(); - ImGui_ImplSW_Data* bd = ImGui_ImplSW_GetBackendData(); - - // Load default font (embedded in code): - uint8_t *tex_data; - int font_width, font_height; - io.Fonts->GetTexDataAsAlpha8(&tex_data, &font_width, &font_height); - SWTexture* texture = new SWTexture((uint32_t*)tex_data,font_width,font_height,true); - io.Fonts->SetTexID((ImTextureID)texture); - bd->FontTexture = texture; - - return true; -} - -void ImGui_ImplSW_DestroyFontsTexture() { - ImGuiIO& io = ImGui::GetIO(); - ImGui_ImplSW_Data* bd = ImGui_ImplSW_GetBackendData(); - if (bd->FontTexture) - { - delete bd->FontTexture; - io.Fonts->SetTexID(0); - bd->FontTexture = 0; - } -} - bool ImGui_ImplSW_CreateDeviceObjects() { return true; } void ImGui_ImplSW_DestroyDeviceObjects() { - ImGui_ImplSW_DestroyFontsTexture(); +} + +void ImGui_ImplSW_UpdateTexture(ImTextureData* tex) { + if (tex->Status==ImTextureStatus_WantCreate) { + SWTexture* t=new SWTexture(tex->Width,tex->Height,tex->Format==ImTextureFormat_Alpha8); + memcpy(t->pixels,tex->GetPixels(),tex->GetSizeInBytes()); + + tex->SetTexID((ImTextureID)t); + tex->SetStatus(ImTextureStatus_OK); + } else if (tex->Status==ImTextureStatus_WantUpdates) { + SWTexture* t=(SWTexture*)tex->GetTexID(); + + // we don't support format changes (this should not happen) + assert(t->isAlpha==(tex->Format==ImTextureFormat_Alpha8)); + + if (t->width!=tex->Width || t->height!=tex->Height) { + // width/height changed; recreate texture + SWTexture* newTex=new SWTexture(tex->Width,tex->Height,tex->Format==ImTextureFormat_Alpha8); + + // copy previous texture to new one + int i_y=0; + int i_y1=0; + if (t->isAlpha) { + for (int i=0; iheight; i++) { + unsigned char* dataOld=(unsigned char*)t->pixels; + unsigned char* dataNew=(unsigned char*)newTex->pixels; + memcpy(&dataNew[i_y1],&dataOld[i_y],t->width); + i_y1+=newTex->width; + i_y+=t->width; + } + } else { + for (int i=0; iheight; i++) { + uint32_t* dataOld=t->pixels; + uint32_t* dataNew=newTex->pixels; + memcpy(&dataNew[i_y1],&dataOld[i_y],t->width*sizeof(uint32_t)); + i_y1+=newTex->width; + i_y+=t->width; + } + } + + // delete previous texture and change texture ID + tex->SetTexID((ImTextureID)newTex); + delete t; + t=newTex; + } + + // update region + if (t->isAlpha) { + unsigned char* data=(unsigned char*)t->pixels; + int i_y=t->width*tex->UpdateRect.y; + for (int i=tex->UpdateRect.y; iUpdateRect.y+tex->UpdateRect.w; i++) { + memcpy(&data[i_y],tex->GetPixelsAt(tex->UpdateRect.x,i),tex->UpdateRect.w); + i_y+=t->width; + } + } else { + uint32_t* data=t->pixels; + int i_y=t->width*tex->UpdateRect.y; + for (int i=tex->UpdateRect.y; iUpdateRect.y+tex->UpdateRect.w; i++) { + memcpy(&data[i_y],tex->GetPixelsAt(tex->UpdateRect.x,i),tex->UpdateRect.w*sizeof(uint32_t)); + i_y+=t->width; + } + } + + tex->SetStatus(ImTextureStatus_OK); + } else if (tex->Status==ImTextureStatus_WantDestroy && tex->UnusedFrames>0) { + SWTexture* t=(SWTexture*)tex->GetTexID(); + delete t; + + tex->SetTexID(ImTextureID_Invalid); + tex->SetStatus(ImTextureStatus_Destroyed); + } else { + // ???????? + } } #endif // #ifndef IMGUI_DISABLE diff --git a/extern/imgui_software_renderer/imgui_sw.hpp b/extern/imgui_software_renderer/imgui_sw.hpp index ad73cbdb6..3f6b9c0e1 100644 --- a/extern/imgui_software_renderer/imgui_sw.hpp +++ b/extern/imgui_software_renderer/imgui_sw.hpp @@ -38,6 +38,7 @@ struct SWTexture managed(true), isAlpha(a) { pixels=new uint32_t[width*height]; + memset(pixels,0,width*height*sizeof(uint32_t)); } ~SWTexture() { if (managed) delete[] pixels; @@ -46,13 +47,14 @@ struct SWTexture IMGUI_IMPL_API bool ImGui_ImplSW_Init(SDL_Window* win); IMGUI_IMPL_API void ImGui_ImplSW_Shutdown(); -IMGUI_IMPL_API bool ImGui_ImplSW_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplSW_NewFrame(); IMGUI_IMPL_API void ImGui_ImplSW_RenderDrawData(ImDrawData* draw_data); // Called by Init/NewFrame/Shutdown -IMGUI_IMPL_API bool ImGui_ImplSW_CreateFontsTexture(); -IMGUI_IMPL_API void ImGui_ImplSW_DestroyFontsTexture(); IMGUI_IMPL_API bool ImGui_ImplSW_CreateDeviceObjects(); IMGUI_IMPL_API void ImGui_ImplSW_DestroyDeviceObjects(); +// for Dear ImGui 1.92+ +IMGUI_IMPL_API void ImGui_ImplSW_UpdateTexture(ImTextureData* tex); + #endif // #ifndef IMGUI_DISABLE diff --git a/src/gui/about.cpp b/src/gui/about.cpp index b04ad0b58..52766a864 100644 --- a/src/gui/about.cpp +++ b/src/gui/about.cpp @@ -264,19 +264,19 @@ void FurnaceGUI::drawAbout() { double posX=(canvasW/2.0)+(sin(double(i)*0.5+double(aboutScroll)/(90.0*dpiScale))*120*dpiScale)-(ImGui::CalcTextSize(nextLine).x*0.5); double posY=(canvasH-aboutScroll+42*i*dpiScale); if (posY<-80*dpiScale || posY>canvasH) continue; - dl->AddText(bigFont,bigFont->FontSize, + dl->AddText(bigFont,BIG_FONT_SIZE, ImVec2(posX+dpiScale,posY+dpiScale), 0xff000000,nextLine); - dl->AddText(bigFont,bigFont->FontSize, + dl->AddText(bigFont,BIG_FONT_SIZE, ImVec2(posX+dpiScale,posY-dpiScale), 0xff000000,nextLine); - dl->AddText(bigFont,bigFont->FontSize, + dl->AddText(bigFont,BIG_FONT_SIZE, ImVec2(posX-dpiScale,posY+dpiScale), 0xff000000,nextLine); - dl->AddText(bigFont,bigFont->FontSize, + dl->AddText(bigFont,BIG_FONT_SIZE, ImVec2(posX-dpiScale,posY-dpiScale), 0xff000000,nextLine); - dl->AddText(bigFont,bigFont->FontSize, + dl->AddText(bigFont,BIG_FONT_SIZE, ImVec2(posX,posY), 0xffffffff,nextLine); } diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 4122de9e9..d3f9af6b5 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -558,7 +558,7 @@ const char* FurnaceGUI::getSystemName(DivSystem which) { } void FurnaceGUI::updateScroll(int amount) { - float lineHeight=(patFont->FontSize+2*dpiScale); + float lineHeight=(PAT_FONT_SIZE+2*dpiScale); nextScroll=lineHeight*amount; haveHitBounds=false; } @@ -569,13 +569,13 @@ void FurnaceGUI::updateScrollRaw(float amount) { } void FurnaceGUI::addScroll(int amount) { - float lineHeight=(patFont->FontSize+2*dpiScale); + float lineHeight=(PAT_FONT_SIZE+2*dpiScale); nextAddScroll=lineHeight*amount; haveHitBounds=false; } void FurnaceGUI::addScrollX(int amount) { - float lineHeight=(patFont->FontSize+2*dpiScale); + float lineHeight=(PAT_FONT_SIZE+2*dpiScale); nextAddScrollX=lineHeight*amount; haveHitBounds=false; } @@ -4304,24 +4304,6 @@ bool FurnaceGUI::loop() { if (rend->areTexturesSquare()) { ImGui::GetIO().Fonts->Flags|=ImFontAtlasFlags_Square; } - if (!ImGui::GetIO().Fonts->Build()) { - logE("error while building font atlas!"); - showError(_("error while loading fonts! please check your settings.")); - ImGui::GetIO().Fonts->Clear(); - mainFont=ImGui::GetIO().Fonts->AddFontDefault(); - patFont=mainFont; - bigFont=mainFont; - headFont=mainFont; - if (rend) { - rend->destroyFontsTexture(); - if (rend->areTexturesSquare()) { - ImGui::GetIO().Fonts->Flags|=ImFontAtlasFlags_Square; - } - } - if (!ImGui::GetIO().Fonts->Build()) { - logE("error again while building font atlas!"); - } - } firstFrame=true; mustClear=2; @@ -4393,9 +4375,7 @@ bool FurnaceGUI::loop() { if (pendingLayoutImport==NULL) pendingLayoutImportStep=0; } - if (!rend->newFrame()) { - fontsFailed=true; - } + rend->newFrame(); ImGui_ImplSDL2_NewFrame(); ImGui::NewFrame(); @@ -7433,35 +7413,6 @@ bool FurnaceGUI::loop() { ImGui::GetIO().Fonts->Clear(); applyUISettings(); - - if (rend) { - rend->destroyFontsTexture(); - if (rend->areTexturesSquare()) { - ImGui::GetIO().Fonts->Flags|=ImFontAtlasFlags_Square; - } - } - if (!ImGui::GetIO().Fonts->Build()) { - logE("error while building font atlas!"); - showError(_("error while loading fonts! please check your settings.")); - ImGui::GetIO().Fonts->Clear(); - mainFont=ImGui::GetIO().Fonts->AddFontDefault(); - patFont=mainFont; - bigFont=mainFont; - headFont=mainFont; - if (rend) { - rend->destroyFontsTexture(); - if (rend->areTexturesSquare()) { - ImGui::GetIO().Fonts->Flags|=ImFontAtlasFlags_Square; - } - } - if (!ImGui::GetIO().Fonts->Build()) { - logE("error again while building font atlas!"); - } else { - rend->createFontsTexture(); - } - } else { - rend->createFontsTexture(); - } } } } @@ -7475,17 +7426,6 @@ bool FurnaceGUI::loop() { patFont=mainFont; bigFont=mainFont; headFont=mainFont; - if (rend) { - rend->destroyFontsTexture(); - if (rend->areTexturesSquare()) { - ImGui::GetIO().Fonts->Flags|=ImFontAtlasFlags_Square; - } - } - if (!ImGui::GetIO().Fonts->Build()) { - logE("error again while building font atlas!"); - } else { - rend->createFontsTexture(); - } } if (!editOptsVisible) { @@ -7898,21 +7838,6 @@ bool FurnaceGUI::init() { if (rend->areTexturesSquare()) { ImGui::GetIO().Fonts->Flags|=ImFontAtlasFlags_Square; } - if (!ImGui::GetIO().Fonts->Build()) { - logE("error while building font atlas!"); - showError(_("error while loading fonts! please check your settings.")); - ImGui::GetIO().Fonts->Clear(); - mainFont=ImGui::GetIO().Fonts->AddFontDefault(); - patFont=mainFont; - bigFont=mainFont; - headFont=mainFont; - if (rend) { - rend->destroyFontsTexture(); - } - if (!ImGui::GetIO().Fonts->Build()) { - logE("error again while building font atlas!"); - } - } logD("preparing layout..."); strncpy(finalLayoutPath,(e->getConfigPath()+String(LAYOUT_INI)).c_str(),4095); @@ -8600,7 +8525,6 @@ FurnaceGUI::FurnaceGUI(): patFont(NULL), bigFont(NULL), headFont(NULL), - fontRange(NULL), songLength(0), songLoopedSectionLength(0), songFadeoutSectionLength(0), diff --git a/src/gui/gui.h b/src/gui/gui.h index 33f778e83..46d541299 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -71,6 +71,11 @@ #define BIND_FOR(x) getMultiKeysName(actionKeys[x].data(),actionKeys[x].size(),true).c_str() +#define MAIN_FONT_SIZE (settings.mainFontSize*dpiScale) +#define PAT_FONT_SIZE (settings.patFontSize*dpiScale) +#define ICON_FONT_SIZE (settings.iconSize*dpiScale) +#define BIG_FONT_SIZE (MAX(1,40*dpiScale)) + #define FM_PREVIEW_SIZE 512 #define CHECK_HIDDEN_SYSTEM(x) \ @@ -1568,10 +1573,8 @@ class FurnaceGUIRender { virtual void setBlendMode(FurnaceGUIBlendMode mode); virtual void resized(const SDL_Event& ev); virtual void clear(ImVec4 color); - virtual bool newFrame(); + virtual void newFrame(); virtual bool canVSync(); - virtual void createFontsTexture(); - virtual void destroyFontsTexture(); virtual void renderGUI(); virtual void wipe(float alpha); virtual void drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 pos1, ImVec4 color, ImVec2 canvasSize, float lineWidth); @@ -1773,8 +1776,6 @@ class FurnaceGUI { ImFont* patFont; ImFont* bigFont; ImFont* headFont; - ImWchar* fontRange; - ImWchar* fontRangeB; ImVec4 uiColors[GUI_COLOR_MAX]; ImVec4 volColors[128]; ImU32 pitchGrad[256]; @@ -1895,10 +1896,6 @@ class FurnaceGUI { int roundedMenus; int roundedTabs; int roundedScrollbars; - int loadJapanese; - int loadChinese; - int loadChineseTraditional; - int loadKorean; int loadFallback; int loadFallbackPat; int fmLayout; @@ -2152,10 +2149,6 @@ class FurnaceGUI { roundedMenus(0), roundedTabs(1), roundedScrollbars(1), - loadJapanese(0), - loadChinese(0), - loadChineseTraditional(0), - loadKorean(0), loadFallback(1), loadFallbackPat(1), fmLayout(4), diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index c0003b01f..482cfb2e8 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -751,7 +751,8 @@ void FurnaceGUI::drawPattern() { signed char l; int ch=decodeUTF8((const unsigned char*)j,l); - totalAdvanced+=ImGui::GetFont()->GetCharAdvance(ch); + // TODO: eliminate use of GetFontBaked()? + totalAdvanced+=ImGui::GetFontBaked()->GetCharAdvance(ch); if (totalAdvanced>(chNameLimit-ellipsisSize)) break; for (int k=0; kCalcTextSizeA(mainFont->FontSize,FLT_MAX,0.0f,ICON_FA_SQUARE).x*0.5f; + iconPos[0].x-=mainFont->CalcTextSizeA(MAIN_FONT_SIZE,FLT_MAX,0.0f,ICON_FA_SQUARE).x*0.5f; dl->AddText(mainFont,settings.mainFontSize*dpiScale,iconPos[0],ImGui::GetColorU32(onOffColor),ICON_FA_SQUARE); // 2. PITCH SLIDE/VIBRATO @@ -1095,7 +1096,7 @@ void FurnaceGUI::drawPattern() { } else { pitchColor=uiColors[GUI_COLOR_PATTERN_STATUS_OFF]; } - iconPos[1].x-=mainFont->CalcTextSizeA(mainFont->FontSize,FLT_MAX,0.0f,pitchIcon).x*0.5f; + iconPos[1].x-=mainFont->CalcTextSizeA(MAIN_FONT_SIZE,FLT_MAX,0.0f,pitchIcon).x*0.5f; dl->AddText(mainFont,settings.mainFontSize*dpiScale,iconPos[1],ImGui::GetColorU32(pitchColor),pitchIcon); @@ -1115,7 +1116,7 @@ void FurnaceGUI::drawPattern() { } else { volColor=uiColors[GUI_COLOR_PATTERN_STATUS_OFF]; } - iconPos[2].x-=mainFont->CalcTextSizeA(mainFont->FontSize,FLT_MAX,0.0f,volIcon).x*0.5f; + iconPos[2].x-=mainFont->CalcTextSizeA(MAIN_FONT_SIZE,FLT_MAX,0.0f,volIcon).x*0.5f; dl->AddText(mainFont,settings.mainFontSize*dpiScale,iconPos[2],ImGui::GetColorU32(volColor),volIcon); // 4. OTHER @@ -1196,7 +1197,7 @@ void FurnaceGUI::drawPattern() { hintColor=uiColors[GUI_COLOR_TEXT]; break; } - iconPos[i+3].x-=mainFont->CalcTextSizeA(mainFont->FontSize,FLT_MAX,0.0f,hints.hint[i]).x*0.5f; + iconPos[i+3].x-=mainFont->CalcTextSizeA(MAIN_FONT_SIZE,FLT_MAX,0.0f,hints.hint[i]).x*0.5f; dl->AddText(mainFont,settings.mainFontSize*dpiScale,iconPos[i+3],ImGui::GetColorU32(hintColor),hints.hint[i]); } } @@ -1757,7 +1758,7 @@ void FurnaceGUI::drawPattern() { for (int j=0; jFontSize) + off.y+(playheadY)+randRange(0,PAT_FONT_SIZE) ); if (partPos.xwinMax.x || partPos.y>winMax.y) continue; @@ -1848,7 +1849,7 @@ void FurnaceGUI::drawPattern() { ImVec2 partPos=ImVec2( off.x+patChanX[i]+(width*0.5+0.5*sin(M_PI*(float)ch->vibratoPosGiant/64.0f)*width), - off.y+(ImGui::GetWindowHeight()*0.5f)+randRange(0,patFont->FontSize) + off.y+(ImGui::GetWindowHeight()*0.5f)+randRange(0,PAT_FONT_SIZE) ); if (!(partPos.xwinMax.x || partPos.y>winMax.y)) { @@ -1878,8 +1879,8 @@ void FurnaceGUI::drawPattern() { if (part.life>255) part.life=255; fdl->AddText( iconFont, - iconFont->FontSize, - ImVec2(part.pos.x-iconFont->FontSize*0.5,part.pos.y-iconFont->FontSize*0.5), + ICON_FONT_SIZE, + ImVec2(part.pos.x-ICON_FONT_SIZE*0.5,part.pos.y-ICON_FONT_SIZE*0.5), part.colors[(int)part.life], part.type ); diff --git a/src/gui/plot_nolerp.cpp b/src/gui/plot_nolerp.cpp index 7951931b5..0d669afc0 100644 --- a/src/gui/plot_nolerp.cpp +++ b/src/gui/plot_nolerp.cpp @@ -482,7 +482,8 @@ int PlotCustomEx(ImGuiPlotType plot_type, const char* label, float (*values_gett std::string guide1=guideFunc(scale_min); ImVec2 maxPos=frame_bb.Min; - maxPos.y=frame_bb.Max.y-ImGui::GetFont()->FontSize; + // TODO: get rid of LegacySize somehow + maxPos.y=frame_bb.Max.y-ImGui::GetFont()->LegacySize; window->DrawList->AddText(maxPos+ImVec2(1.0f,1.0f),0xff000000,guide1.c_str()); window->DrawList->AddText(maxPos+ImVec2(1.0f,-1.0f),0xff000000,guide1.c_str()); window->DrawList->AddText(maxPos+ImVec2(-1.0f,1.0f),0xff000000,guide1.c_str()); diff --git a/src/gui/render/abstract.cpp b/src/gui/render/abstract.cpp index 2994654a1..0c9d2dbc9 100644 --- a/src/gui/render/abstract.cpp +++ b/src/gui/render/abstract.cpp @@ -71,20 +71,13 @@ void FurnaceGUIRender::resized(const SDL_Event& ev) { void FurnaceGUIRender::clear(ImVec4 color) { } -bool FurnaceGUIRender::newFrame() { - return true; +void FurnaceGUIRender::newFrame() { } bool FurnaceGUIRender::canVSync() { return true; } -void FurnaceGUIRender::createFontsTexture() { -} - -void FurnaceGUIRender::destroyFontsTexture() { -} - void FurnaceGUIRender::renderGUI() { } diff --git a/src/gui/render/renderDX11.cpp b/src/gui/render/renderDX11.cpp index 86e1b94a1..0e8e306b5 100644 --- a/src/gui/render/renderDX11.cpp +++ b/src/gui/render/renderDX11.cpp @@ -308,8 +308,8 @@ void FurnaceGUIRenderDX11::clear(ImVec4 color) { context->ClearRenderTargetView(renderTarget,floatColor); } -bool FurnaceGUIRenderDX11::newFrame() { - return ImGui_ImplDX11_NewFrame(); +void FurnaceGUIRenderDX11::newFrame() { + ImGui_ImplDX11_NewFrame(); } bool FurnaceGUIRenderDX11::canVSync() { @@ -317,14 +317,6 @@ bool FurnaceGUIRenderDX11::canVSync() { return true; } -void FurnaceGUIRenderDX11::createFontsTexture() { - ImGui_ImplDX11_CreateDeviceObjects(); -} - -void FurnaceGUIRenderDX11::destroyFontsTexture() { - ImGui_ImplDX11_InvalidateDeviceObjects(); -} - void FurnaceGUIRenderDX11::renderGUI() { ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); } diff --git a/src/gui/render/renderDX11.h b/src/gui/render/renderDX11.h index 65d16a422..6b4fd93d7 100644 --- a/src/gui/render/renderDX11.h +++ b/src/gui/render/renderDX11.h @@ -74,10 +74,8 @@ class FurnaceGUIRenderDX11: public FurnaceGUIRender { void setBlendMode(FurnaceGUIBlendMode mode); void resized(const SDL_Event& ev); void clear(ImVec4 color); - bool newFrame(); + void newFrame(); bool canVSync(); - void createFontsTexture(); - void destroyFontsTexture(); void renderGUI(); void wipe(float alpha); void present(); diff --git a/src/gui/render/renderDX9.cpp b/src/gui/render/renderDX9.cpp index 505b0dedc..538fdbd2f 100644 --- a/src/gui/render/renderDX9.cpp +++ b/src/gui/render/renderDX9.cpp @@ -344,22 +344,14 @@ void FurnaceGUIRenderDX9::present() { } } -bool FurnaceGUIRenderDX9::newFrame() { - return ImGui_ImplDX9_NewFrame(); +void FurnaceGUIRenderDX9::newFrame() { + ImGui_ImplDX9_NewFrame(); } bool FurnaceGUIRenderDX9::canVSync() { return supportsVSync; } -void FurnaceGUIRenderDX9::createFontsTexture() { - ImGui_ImplDX9_CreateDeviceObjects(); -} - -void FurnaceGUIRenderDX9::destroyFontsTexture() { - ImGui_ImplDX9_InvalidateDeviceObjects(); -} - void FurnaceGUIRenderDX9::renderGUI() { if (!inScene) { HRESULT result=device->BeginScene(); diff --git a/src/gui/render/renderDX9.h b/src/gui/render/renderDX9.h index 37d0392a2..1b661515a 100644 --- a/src/gui/render/renderDX9.h +++ b/src/gui/render/renderDX9.h @@ -57,11 +57,9 @@ class FurnaceGUIRenderDX9: public FurnaceGUIRender { void setBlendMode(FurnaceGUIBlendMode mode); void resized(const SDL_Event& ev); void clear(ImVec4 color); - bool newFrame(); + void newFrame(); bool canVSync(); bool areTexturesSquare(); - void createFontsTexture(); - void destroyFontsTexture(); void renderGUI(); void wipe(float alpha); void present(); diff --git a/src/gui/render/renderGL.cpp b/src/gui/render/renderGL.cpp index 8a10ad030..ba97ee351 100644 --- a/src/gui/render/renderGL.cpp +++ b/src/gui/render/renderGL.cpp @@ -382,22 +382,14 @@ void FurnaceGUIRenderGL::clear(ImVec4 color) { C(glClear(GL_COLOR_BUFFER_BIT)); } -bool FurnaceGUIRenderGL::newFrame() { - return ImGui_ImplOpenGL3_NewFrame(); +void FurnaceGUIRenderGL::newFrame() { + ImGui_ImplOpenGL3_NewFrame(); } bool FurnaceGUIRenderGL::canVSync() { return swapIntervalSet; } -void FurnaceGUIRenderGL::createFontsTexture() { - ImGui_ImplOpenGL3_CreateFontsTexture(); -} - -void FurnaceGUIRenderGL::destroyFontsTexture() { - ImGui_ImplOpenGL3_DestroyFontsTexture(); -} - void FurnaceGUIRenderGL::renderGUI() { ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); } diff --git a/src/gui/render/renderGL.h b/src/gui/render/renderGL.h index ce2ff775d..7f3e05dd5 100644 --- a/src/gui/render/renderGL.h +++ b/src/gui/render/renderGL.h @@ -65,10 +65,8 @@ class FurnaceGUIRenderGL: public FurnaceGUIRender { void setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode); void setBlendMode(FurnaceGUIBlendMode mode); void clear(ImVec4 color); - bool newFrame(); + void newFrame(); bool canVSync(); - void createFontsTexture(); - void destroyFontsTexture(); void renderGUI(); void wipe(float alpha); void drawOsc(float* data, size_t len, ImVec2 pos0, ImVec2 pos1, ImVec4 color, ImVec2 canvasSize, float lineWidth); diff --git a/src/gui/render/renderGL1.cpp b/src/gui/render/renderGL1.cpp index e689c379d..d4aab44c6 100644 --- a/src/gui/render/renderGL1.cpp +++ b/src/gui/render/renderGL1.cpp @@ -173,22 +173,14 @@ void FurnaceGUIRenderGL1::clear(ImVec4 color) { C(glClear(GL_COLOR_BUFFER_BIT)); } -bool FurnaceGUIRenderGL1::newFrame() { - return ImGui_ImplOpenGL2_NewFrame(); +void FurnaceGUIRenderGL1::newFrame() { + ImGui_ImplOpenGL2_NewFrame(); } bool FurnaceGUIRenderGL1::canVSync() { return swapIntervalSet; } -void FurnaceGUIRenderGL1::createFontsTexture() { - ImGui_ImplOpenGL2_CreateFontsTexture(); -} - -void FurnaceGUIRenderGL1::destroyFontsTexture() { - ImGui_ImplOpenGL2_DestroyFontsTexture(); -} - void FurnaceGUIRenderGL1::renderGUI() { ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData()); } diff --git a/src/gui/render/renderGL1.h b/src/gui/render/renderGL1.h index f48817f54..1b8462974 100644 --- a/src/gui/render/renderGL1.h +++ b/src/gui/render/renderGL1.h @@ -41,11 +41,9 @@ class FurnaceGUIRenderGL1: public FurnaceGUIRender { void setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode); void setBlendMode(FurnaceGUIBlendMode mode); void clear(ImVec4 color); - bool newFrame(); + void newFrame(); bool canVSync(); bool areTexturesSquare(); - void createFontsTexture(); - void destroyFontsTexture(); void renderGUI(); void wipe(float alpha); void present(); diff --git a/src/gui/render/renderMetal.h b/src/gui/render/renderMetal.h index b6efc8979..c2f1bde23 100644 --- a/src/gui/render/renderMetal.h +++ b/src/gui/render/renderMetal.h @@ -37,10 +37,8 @@ class FurnaceGUIRenderMetal: public FurnaceGUIRender { void setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode); void setBlendMode(FurnaceGUIBlendMode mode); void clear(ImVec4 color); - bool newFrame(); + void newFrame(); bool canVSync(); - void createFontsTexture(); - void destroyFontsTexture(); void renderGUI(); void wipe(float alpha); void present(); diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 10941707a..3b8b79472 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -150,22 +150,14 @@ void FurnaceGUIRenderMetal::clear(ImVec4 color) { priv->renderEncoder=[priv->cmdBuf renderCommandEncoderWithDescriptor:priv->renderPass]; } -bool FurnaceGUIRenderMetal::newFrame() { - return ImGui_ImplMetal_NewFrame(priv->renderPass); +void FurnaceGUIRenderMetal::newFrame() { + ImGui_ImplMetal_NewFrame(priv->renderPass); } bool FurnaceGUIRenderMetal::canVSync() { return swapIntervalSet; } -void FurnaceGUIRenderMetal::createFontsTexture() { - ImGui_ImplMetal_CreateFontsTexture(priv->context.device); -} - -void FurnaceGUIRenderMetal::destroyFontsTexture() { - ImGui_ImplMetal_DestroyFontsTexture(); -} - void FurnaceGUIRenderMetal::renderGUI() { ImGui_ImplMetal_RenderDrawData(ImGui::GetDrawData(),priv->cmdBuf,priv->renderEncoder); } diff --git a/src/gui/render/renderSDL.cpp b/src/gui/render/renderSDL.cpp index 092c564bc..5a49a40b6 100644 --- a/src/gui/render/renderSDL.cpp +++ b/src/gui/render/renderSDL.cpp @@ -120,22 +120,14 @@ void FurnaceGUIRenderSDL::clear(ImVec4 color) { SDL_RenderClear(sdlRend); } -bool FurnaceGUIRenderSDL::newFrame() { - return ImGui_ImplSDLRenderer2_NewFrame(); +void FurnaceGUIRenderSDL::newFrame() { + ImGui_ImplSDLRenderer2_NewFrame(); } bool FurnaceGUIRenderSDL::canVSync() { return swapIntervalSet; } -void FurnaceGUIRenderSDL::createFontsTexture() { - ImGui_ImplSDLRenderer2_CreateFontsTexture(); -} - -void FurnaceGUIRenderSDL::destroyFontsTexture() { - ImGui_ImplSDLRenderer2_DestroyFontsTexture(); -} - void FurnaceGUIRenderSDL::renderGUI() { ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData(),sdlRend); } diff --git a/src/gui/render/renderSDL.h b/src/gui/render/renderSDL.h index f5dcef135..8b96ddcca 100644 --- a/src/gui/render/renderSDL.h +++ b/src/gui/render/renderSDL.h @@ -35,10 +35,8 @@ class FurnaceGUIRenderSDL: public FurnaceGUIRender { void setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode); void setBlendMode(FurnaceGUIBlendMode mode); void clear(ImVec4 color); - bool newFrame(); + void newFrame(); bool canVSync(); - void createFontsTexture(); - void destroyFontsTexture(); void renderGUI(); void wipe(float alpha); void present(); diff --git a/src/gui/render/renderSoftware.cpp b/src/gui/render/renderSoftware.cpp index 1cc969b24..f39767c73 100644 --- a/src/gui/render/renderSoftware.cpp +++ b/src/gui/render/renderSoftware.cpp @@ -105,22 +105,14 @@ void FurnaceGUIRenderSoftware::clear(ImVec4 color) { } } -bool FurnaceGUIRenderSoftware::newFrame() { - return ImGui_ImplSW_NewFrame(); +void FurnaceGUIRenderSoftware::newFrame() { + ImGui_ImplSW_NewFrame(); } bool FurnaceGUIRenderSoftware::canVSync() { return false; } -void FurnaceGUIRenderSoftware::createFontsTexture() { - ImGui_ImplSW_CreateFontsTexture(); -} - -void FurnaceGUIRenderSoftware::destroyFontsTexture() { - ImGui_ImplSW_DestroyFontsTexture(); -} - void FurnaceGUIRenderSoftware::renderGUI() { ImGui_ImplSW_RenderDrawData(ImGui::GetDrawData()); } diff --git a/src/gui/render/renderSoftware.h b/src/gui/render/renderSoftware.h index 76e782007..ce240d58b 100644 --- a/src/gui/render/renderSoftware.h +++ b/src/gui/render/renderSoftware.h @@ -32,10 +32,8 @@ class FurnaceGUIRenderSoftware: public FurnaceGUIRender { void setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode); void setBlendMode(FurnaceGUIBlendMode mode); void clear(ImVec4 color); - bool newFrame(); + void newFrame(); bool canVSync(); - void createFontsTexture(); - void destroyFontsTexture(); void renderGUI(); void wipe(float alpha); void present(); diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 17383115d..e9bf658d2 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -3183,62 +3183,6 @@ void FurnaceGUI::drawSettings() { ImGui::SetTooltip(_("disable to save video memory.")); } - bool loadJapaneseB=settings.loadJapanese; - if (ImGui::Checkbox(_("Display Japanese characters"),&loadJapaneseB)) { - settings.loadJapanese=loadJapaneseB; - settingsChanged=true; - } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip(_( - "Only toggle this option if you have enough graphics memory.\n" - "This is a temporary solution until dynamic font atlas is implemented in Dear ImGui.\n\n" - "このオプションは、十分なグラフィックメモリがある場合にのみ切り替えてください。\n" - "これは、Dear ImGuiにダイナミックフォントアトラスが実装されるまでの一時的な解決策です。" - )); - } - - bool loadChineseB=settings.loadChinese; - if (ImGui::Checkbox(_("Display Chinese (Simplified) characters"),&loadChineseB)) { - settings.loadChinese=loadChineseB; - settingsChanged=true; - } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip(_( - "Only toggle this option if you have enough graphics memory.\n" - "This is a temporary solution until dynamic font atlas is implemented in Dear ImGui.\n\n" - "请在确保你有足够的显存后再启动此设定\n" - "这是一个在ImGui实现动态字体加载之前的临时解决方案" - )); - } - - bool loadChineseTraditionalB=settings.loadChineseTraditional; - if (ImGui::Checkbox(_("Display Chinese (Traditional) characters"),&loadChineseTraditionalB)) { - settings.loadChineseTraditional=loadChineseTraditionalB; - settingsChanged=true; - } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip(_( - "Only toggle this option if you have enough graphics memory.\n" - "This is a temporary solution until dynamic font atlas is implemented in Dear ImGui.\n\n" - "請在確保你有足夠的顯存后再啟動此設定\n" - "這是一個在ImGui實現動態字體加載之前的臨時解決方案" - )); - } - - bool loadKoreanB=settings.loadKorean; - if (ImGui::Checkbox(_("Display Korean characters"),&loadKoreanB)) { - settings.loadKorean=loadKoreanB; - settingsChanged=true; - } - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip(_( - "Only toggle this option if you have enough graphics memory.\n" - "This is a temporary solution until dynamic font atlas is implemented in Dear ImGui.\n\n" - "그래픽 메모리가 충분한 경우에만 이 옵션을 선택하십시오.\n" - "이 옵션은 Dear ImGui에 동적 글꼴 아틀라스가 구현될 때까지 임시 솔루션입니다." - )); - } - // SUBSECTION PROGRAM CONFIG_SUBSECTION(_("Program")); ImGui::Text(_("Title bar:")); @@ -5058,10 +5002,6 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { settings.headFontPath=conf.getString("headFontPath",""); settings.patFontPath=conf.getString("patFontPath",""); - settings.loadJapanese=conf.getInt("loadJapanese",0); - settings.loadChinese=conf.getInt("loadChinese",0); - settings.loadChineseTraditional=conf.getInt("loadChineseTraditional",0); - settings.loadKorean=conf.getInt("loadKorean",0); settings.loadFallback=conf.getInt("loadFallback",1); settings.loadFallbackPat=conf.getInt("loadFallbackPat",1); @@ -5315,10 +5255,6 @@ void FurnaceGUI::readConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { clampSetting(settings.roundedMenus,0,1); clampSetting(settings.roundedTabs,0,1); clampSetting(settings.roundedScrollbars,0,1); - clampSetting(settings.loadJapanese,0,1); - clampSetting(settings.loadChinese,0,1); - clampSetting(settings.loadChineseTraditional,0,1); - clampSetting(settings.loadKorean,0,1); clampSetting(settings.loadFallback,0,1); clampSetting(settings.loadFallbackPat,0,1); clampSetting(settings.fmLayout,0,7); @@ -5647,10 +5583,6 @@ void FurnaceGUI::writeConfig(DivConfig& conf, FurnaceGUISettingGroups groups) { conf.set("headFontPath",settings.headFontPath); conf.set("patFontPath",settings.patFontPath); - conf.set("loadJapanese",settings.loadJapanese); - conf.set("loadChinese",settings.loadChinese); - conf.set("loadChineseTraditional",settings.loadChineseTraditional); - conf.set("loadKorean",settings.loadKorean); conf.set("loadFallback",settings.loadFallback); conf.set("loadFallbackPat",settings.loadFallbackPat); @@ -5897,35 +5829,6 @@ void FurnaceGUI::commitSettings() { applyUISettings(); - if (rend) { - rend->destroyFontsTexture(); - if (rend->areTexturesSquare()) { - ImGui::GetIO().Fonts->Flags|=ImFontAtlasFlags_Square; - } - } - if (!ImGui::GetIO().Fonts->Build()) { - logE("error while building font atlas!"); - showError(_("error while loading fonts! please check your settings.")); - ImGui::GetIO().Fonts->Clear(); - mainFont=ImGui::GetIO().Fonts->AddFontDefault(); - patFont=mainFont; - bigFont=mainFont; - headFont=mainFont; - if (rend) { - rend->destroyFontsTexture(); - if (rend->areTexturesSquare()) { - ImGui::GetIO().Fonts->Flags|=ImFontAtlasFlags_Square; - } - } - if (!ImGui::GetIO().Fonts->Build()) { - logE("error again while building font atlas!"); - } else { - rend->createFontsTexture(); - } - } else { - rend->createFontsTexture(); - } - audioEngineChanged=false; } @@ -6613,275 +6516,52 @@ void FurnaceGUI::applyUISettings(bool updateFonts) { // prepare #ifdef HAVE_FREETYPE if (settings.fontBackend==1) { - ImGui::GetIO().Fonts->FontBuilderIO=ImGuiFreeType::GetBuilderForFreeType(); - ImGui::GetIO().Fonts->FontBuilderFlags&=~( - ImGuiFreeTypeBuilderFlags_NoHinting| - ImGuiFreeTypeBuilderFlags_NoAutoHint| - ImGuiFreeTypeBuilderFlags_ForceAutoHint| - ImGuiFreeTypeBuilderFlags_LightHinting| - ImGuiFreeTypeBuilderFlags_MonoHinting| - ImGuiFreeTypeBuilderFlags_Bold| - ImGuiFreeTypeBuilderFlags_Oblique| - ImGuiFreeTypeBuilderFlags_Monochrome| - ImGuiFreeTypeBuilderFlags_LoadColor| - ImGuiFreeTypeBuilderFlags_Bitmap + ImGui::GetIO().Fonts->FontLoader=ImGuiFreeType::GetFontLoader(); + ImGui::GetIO().Fonts->FontLoaderFlags&=~( + ImGuiFreeTypeLoaderFlags_NoHinting| + ImGuiFreeTypeLoaderFlags_NoAutoHint| + ImGuiFreeTypeLoaderFlags_ForceAutoHint| + ImGuiFreeTypeLoaderFlags_LightHinting| + ImGuiFreeTypeLoaderFlags_MonoHinting| + ImGuiFreeTypeLoaderFlags_Bold| + ImGuiFreeTypeLoaderFlags_Oblique| + ImGuiFreeTypeLoaderFlags_Monochrome| + ImGuiFreeTypeLoaderFlags_LoadColor| + ImGuiFreeTypeLoaderFlags_Bitmap ); - if (!settings.fontAntiAlias) ImGui::GetIO().Fonts->FontBuilderFlags|=ImGuiFreeTypeBuilderFlags_Monochrome; - if (settings.fontBitmap) ImGui::GetIO().Fonts->FontBuilderFlags|=ImGuiFreeTypeBuilderFlags_Bitmap; + if (!settings.fontAntiAlias) ImGui::GetIO().Fonts->FontLoaderFlags|=ImGuiFreeTypeLoaderFlags_Monochrome; + if (settings.fontBitmap) ImGui::GetIO().Fonts->FontLoaderFlags|=ImGuiFreeTypeLoaderFlags_Bitmap; switch (settings.fontHinting) { case 0: // off - ImGui::GetIO().Fonts->FontBuilderFlags|=ImGuiFreeTypeBuilderFlags_NoHinting; + ImGui::GetIO().Fonts->FontLoaderFlags|=ImGuiFreeTypeLoaderFlags_NoHinting; break; case 1: // slight - ImGui::GetIO().Fonts->FontBuilderFlags|=ImGuiFreeTypeBuilderFlags_LightHinting; + ImGui::GetIO().Fonts->FontLoaderFlags|=ImGuiFreeTypeLoaderFlags_LightHinting; break; case 2: // normal break; case 3: // full - ImGui::GetIO().Fonts->FontBuilderFlags|=ImGuiFreeTypeBuilderFlags_MonoHinting; + ImGui::GetIO().Fonts->FontLoaderFlags|=ImGuiFreeTypeLoaderFlags_MonoHinting; break; } switch (settings.fontAutoHint) { case 0: // off - ImGui::GetIO().Fonts->FontBuilderFlags|=ImGuiFreeTypeBuilderFlags_NoAutoHint; + ImGui::GetIO().Fonts->FontLoaderFlags|=ImGuiFreeTypeLoaderFlags_NoAutoHint; break; case 1: // on break; case 2: // force - ImGui::GetIO().Fonts->FontBuilderFlags|=ImGuiFreeTypeBuilderFlags_ForceAutoHint; + ImGui::GetIO().Fonts->FontLoaderFlags|=ImGuiFreeTypeLoaderFlags_ForceAutoHint; break; } } else { - ImGui::GetIO().Fonts->FontBuilderIO=ImFontAtlasGetBuilderForStbTruetype(); + ImGui::GetIO().Fonts->FontLoader=ImFontAtlasGetFontLoaderForStbTruetype(); } #endif - - // set to 800 for now due to problems with unifont - static const ImWchar upTo800[]={ - // base - 0x20,0x7e,0xa0,0x800, - // for "Display characters" and language choices - 0x107, 0x107, - 0x10d, 0x10d, - 0x131, 0x131, - 0x142, 0x142, - 0x15f, 0x15f, - 0x17c, 0x17c, - 0x420, 0x420, - 0x423, 0x423, - 0x430, 0x430, - 0x431, 0x431, - 0x432, 0x432, - 0x433, 0x433, - 0x435, 0x435, - 0x437, 0x437, - 0x438, 0x438, - 0x439, 0x439, - 0x43a, 0x43a, - 0x43b, 0x43b, - 0x43c, 0x43c, - 0x43d, 0x43d, - 0x43e, 0x43e, - 0x43f, 0x43f, - 0x440, 0x440, - 0x441, 0x441, - 0x442, 0x442, - 0x443, 0x443, - 0x446, 0x446, - 0x447, 0x447, - 0x448, 0x448, - 0x449, 0x449, - 0x44b, 0x44b, - 0x44c, 0x44c, - 0x44d, 0x44d, - 0x44f, 0x44f, - 0x456, 0x456, - 0x457, 0x457, - 0x540, 0x540, - 0x561, 0x561, - 0x565, 0x565, - 0x575, 0x575, - 0x576, 0x576, - 0x580, 0x580, - 0xe17, 0xe17, - 0xe22, 0xe22, - 0xe44, 0xe44, - 0x3001, 0x3001, - 0x3002, 0x3002, - 0x3042, 0x3042, - 0x3044, 0x3044, - 0x3048, 0x3048, - 0x304c, 0x304c, - 0x304f, 0x304f, - 0x3053, 0x3053, - 0x3055, 0x3055, - 0x3059, 0x3059, - 0x3060, 0x3060, - 0x3066, 0x3066, - 0x3067, 0x3067, - 0x306a, 0x306a, - 0x306b, 0x306b, - 0x306e, 0x306e, - 0x306f, 0x306f, - 0x307e, 0x307e, - 0x307f, 0x307f, - 0x308a, 0x308a, - 0x308b, 0x308b, - 0x308c, 0x308c, - 0x30a2, 0x30a2, - 0x30a3, 0x30a3, - 0x30a4, 0x30a4, - 0x30a9, 0x30a9, - 0x30aa, 0x30aa, - 0x30af, 0x30af, - 0x30b0, 0x30b0, - 0x30b7, 0x30b7, - 0x30b9, 0x30b9, - 0x30c0, 0x30c0, - 0x30c3, 0x30c3, - 0x30c8, 0x30c8, - 0x30ca, 0x30ca, - 0x30d5, 0x30d5, - 0x30d7, 0x30d7, - 0x30df, 0x30df, - 0x30e1, 0x30e1, - 0x30e2, 0x30e2, - 0x30e7, 0x30e7, - 0x30e9, 0x30e9, - 0x30ea, 0x30ea, - 0x30f3, 0x30f3, - 0x4e00, 0x4e00, - 0x4e2a, 0x4e2a, - 0x4e34, 0x4e34, - 0x4e4b, 0x4e4b, - 0x4f53, 0x4f53, - 0x4f60, 0x4f60, - 0x4fdd, 0x4fdd, - 0x500b, 0x500b, - 0x518d, 0x518d, - 0x51b3, 0x51b3, - 0x5206, 0x5206, - 0x5207, 0x5207, - 0x524d, 0x524d, - 0x52a0, 0x52a0, - 0x52a8, 0x52a8, - 0x52d5, 0x52d5, - 0x5341, 0x5341, - 0x5408, 0x5408, - 0x540e, 0x540e, - 0x542f, 0x542f, - 0x555f, 0x555f, - 0x5728, 0x5728, - 0x5834, 0x5834, - 0x591f, 0x591f, - 0x5920, 0x5920, - 0x5b57, 0x5b57, - 0x5b58, 0x5b58, - 0x5b9a, 0x5b9a, - 0x5b9e, 0x5b9e, - 0x5b9f, 0x5b9f, - 0x5be6, 0x5be6, - 0x6001, 0x6001, - 0x614b, 0x614b, - 0x65b9, 0x65b9, - 0x65e5, 0x65e5, - 0x65f6, 0x65f6, - 0x662f, 0x662f, - 0x663e, 0x663e, - 0x6642, 0x6642, - 0x66ff, 0x66ff, - 0x6709, 0x6709, - 0x672c, 0x672c, - 0x6848, 0x6848, - 0x6b64, 0x6b64, - 0x6c7a, 0x6c7a, - 0x73b0, 0x73b0, - 0x73fe, 0x73fe, - 0x7684, 0x7684, - 0x786e, 0x786e, - 0x78ba, 0x78ba, - 0x7b56, 0x7b56, - 0x81e8, 0x81e8, - 0x88c5, 0x88c5, - 0x89e3, 0x89e3, - 0x8a2d, 0x8a2d, - 0x8a9e, 0x8a9e, - 0x8acb, 0x8acb, - 0x8bbe, 0x8bbe, - 0x8bf7, 0x8bf7, - 0x8db3, 0x8db3, - 0x8f09, 0x8f09, - 0x8f7d, 0x8f7d, - 0x8fd9, 0x8fd9, - 0x9019, 0x9019, - 0x986f, 0x986f, - 0x9ad4, 0x9ad4, - 0xac00, 0xac00, - 0xacbd, 0xacbd, - 0xad6c, 0xad6c, - 0xad6d, 0xad6d, - 0xadf8, 0xadf8, - 0xae00, 0xae00, - 0xae4c, 0xae4c, - 0xaf34, 0xaf34, - 0xb2c8, 0xb2c8, - 0xb2e4, 0xb2e4, - 0xb3d9, 0xb3d9, - 0xb420, 0xb420, - 0xb54c, 0xb54c, - 0xb77c, 0xb77c, - 0xb798, 0xb798, - 0xb824, 0xb824, - 0xb8e8, 0xb8e8, - 0xb97c, 0xb97c, - 0xb9ac, 0xb9ac, - 0xb9cc, 0xb9cc, - 0xba54, 0xba54, - 0xba74, 0xba74, - 0xbaa8, 0xbaa8, - 0xbd84, 0xbd84, - 0xc120, 0xc120, - 0xc124, 0xc124, - 0xc158, 0xc158, - 0xc194, 0xc194, - 0xc2a4, 0xc2a4, - 0xc2dc, 0xc2dc, - 0xc2ed, 0xc2ed, - 0xc544, 0xc544, - 0xc57c, 0xc57c, - 0xc5b4, 0xc5b4, - 0xc5d0, 0xc5d0, - 0xc624, 0xc624, - 0xc635, 0xc635, - 0xc6a9, 0xc6a9, - 0xc6b0, 0xc6b0, - 0xc740, 0xc740, - 0xc744, 0xc744, - 0xc774, 0xc774, - 0xc784, 0xc784, - 0xc785, 0xc785, - 0xc791, 0xc791, - 0xc801, 0xc801, - 0xc815, 0xc815, - 0xc9c0, 0xc9c0, - 0xcda9, 0xcda9, - 0xd0dd, 0xd0dd, - 0xd2c0, 0xd2c0, - 0xd53d, 0xd53d, - 0xd558, 0xd558, - 0xd55c, 0xd55c, - 0xd569, 0xd569, - 0xd574, 0xd574, - 0xd604, 0xd604, - 0 - }; - ImFontGlyphRangesBuilder range; - ImVector outRange; - ImFontConfig fontConf; ImFontConfig fontConfP; ImFontConfig fontConfB; @@ -6910,33 +6590,6 @@ void FurnaceGUI::applyUISettings(bool updateFonts) { //fontConf.RasterizerMultiply=1.5; //fontConfP.RasterizerMultiply=1.5; - range.AddRanges(upTo800); - if (settings.loadJapanese || localeRequiresJapanese) { - range.AddRanges(ImGui::GetIO().Fonts->GetGlyphRangesJapanese()); - } - if (settings.loadChinese || localeRequiresChinese) { - range.AddRanges(ImGui::GetIO().Fonts->GetGlyphRangesChineseSimplifiedCommon()); - } - if (settings.loadChineseTraditional || localeRequiresChineseTrad) { - range.AddRanges(ImGui::GetIO().Fonts->GetGlyphRangesChineseFull()); - } - if (settings.loadKorean || localeRequiresKorean) { - range.AddRanges(ImGui::GetIO().Fonts->GetGlyphRangesKorean()); - } - if (!localeExtraRanges.empty()) { - range.AddRanges(localeExtraRanges.data()); - } - // I'm terribly sorry - range.UsedChars[0x80>>5]=0; - - range.BuildRanges(&outRange); - if (fontRange!=NULL) delete[] fontRange; - fontRange=new ImWchar[outRange.size()]; - int index=0; - for (ImWchar& i: outRange) { - fontRange[index++]=i; - } - if (settings.mainFont<0 || settings.mainFont>6) settings.mainFont=0; if (settings.headFont<0 || settings.headFont>6) settings.headFont=0; if (settings.patFont<0 || settings.patFont>6) settings.patFont=0; @@ -6961,21 +6614,21 @@ void FurnaceGUI::applyUISettings(bool updateFonts) { fc1.OversampleV=1; if (settings.mainFont==6) { // custom font - if ((mainFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(settings.mainFontPath.c_str(),MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fontConf,fontRange))==NULL) { + if ((mainFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(settings.mainFontPath.c_str(),MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fontConf))==NULL) { logW("could not load UI font! reverting to default font"); settings.mainFont=GUI_MAIN_FONT_DEFAULT; - if ((mainFont=addFontZlib(builtinFont[settings.mainFont],builtinFontLen[settings.mainFont],MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fontConf,fontRange))==NULL) { + if ((mainFont=addFontZlib(builtinFont[settings.mainFont],builtinFontLen[settings.mainFont],MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fontConf))==NULL) { logE("could not load UI font! falling back to Proggy Clean."); mainFont=ImGui::GetIO().Fonts->AddFontDefault(); } } } else if (settings.mainFont==5) { // system font - if ((mainFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_FONT_PATH_1,MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fontConf,fontRange))==NULL) { - if ((mainFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_FONT_PATH_2,MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fontConf,fontRange))==NULL) { - if ((mainFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_FONT_PATH_3,MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fontConf,fontRange))==NULL) { + if ((mainFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_FONT_PATH_1,MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fontConf))==NULL) { + if ((mainFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_FONT_PATH_2,MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fontConf))==NULL) { + if ((mainFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_FONT_PATH_3,MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fontConf))==NULL) { logW("could not load UI font! reverting to default font"); settings.mainFont=GUI_MAIN_FONT_DEFAULT; - if ((mainFont=addFontZlib(builtinFont[settings.mainFont],builtinFontLen[settings.mainFont],MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fontConf,fontRange))==NULL) { + if ((mainFont=addFontZlib(builtinFont[settings.mainFont],builtinFontLen[settings.mainFont],MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fontConf))==NULL) { logE("could not load UI font! falling back to Proggy Clean."); mainFont=ImGui::GetIO().Fonts->AddFontDefault(); } @@ -6983,26 +6636,18 @@ void FurnaceGUI::applyUISettings(bool updateFonts) { } } } else { - if ((mainFont=addFontZlib(builtinFont[settings.mainFont],builtinFontLen[settings.mainFont],MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fontConf,fontRange))==NULL) { + if ((mainFont=addFontZlib(builtinFont[settings.mainFont],builtinFontLen[settings.mainFont],MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fontConf))==NULL) { logE("could not load UI font! falling back to Proggy Clean."); mainFont=ImGui::GetIO().Fonts->AddFontDefault(); } } // four fallback fonts - if (settings.loadJapanese || - settings.loadChinese || - settings.loadChineseTraditional || - settings.loadKorean || - localeRequiresJapanese || - localeRequiresChinese || - localeRequiresChineseTrad || - localeRequiresKorean || - settings.loadFallback) { - mainFont=addFontZlib(font_plexSans_compressed_data,font_plexSans_compressed_size,MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fc1,fontRange); - mainFont=addFontZlib(font_plexSansJP_compressed_data,font_plexSansJP_compressed_size,MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fc1,fontRange); - mainFont=addFontZlib(font_plexSansKR_compressed_data,font_plexSansKR_compressed_size,MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fc1,fontRange); - mainFont=addFontZlib(font_unifont_compressed_data,font_unifont_compressed_size,MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fc1,fontRange); + if (settings.loadFallback) { + mainFont=addFontZlib(font_plexSans_compressed_data,font_plexSans_compressed_size,MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fc1); + mainFont=addFontZlib(font_plexSansJP_compressed_data,font_plexSansJP_compressed_size,MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fc1); + mainFont=addFontZlib(font_plexSansKR_compressed_data,font_plexSansKR_compressed_size,MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fc1); + mainFont=addFontZlib(font_unifont_compressed_data,font_unifont_compressed_size,MAX(1,e->getConfInt("mainFontSize",18)*dpiScale),&fc1); } ImFontConfig fc; @@ -7011,13 +6656,11 @@ void FurnaceGUI::applyUISettings(bool updateFonts) { fc.OversampleV=1; fc.PixelSnapH=true; fc.GlyphMinAdvanceX=e->getConfInt("iconSize",16)*dpiScale; - static const ImWchar fontRangeIcon[]={ICON_MIN_FA,ICON_MAX_FA,0}; - if ((iconFont=addFontZlib(iconFont_compressed_data,iconFont_compressed_size,MAX(1,e->getConfInt("iconSize",16)*dpiScale),&fc,fontRangeIcon))==NULL) { + if ((iconFont=addFontZlib(iconFont_compressed_data,iconFont_compressed_size,MAX(1,e->getConfInt("iconSize",16)*dpiScale),&fc))==NULL) { logE("could not load icon font!"); } - static const ImWchar fontRangeFurIcon[]={ICON_MIN_FUR,ICON_MAX_FUR,0}; - if ((furIconFont=addFontZlib(furIcons_compressed_data,furIcons_compressed_size,MAX(1,e->getConfInt("iconSize",16)*dpiScale),&fc,fontRangeFurIcon))==NULL) { + if ((furIconFont=addFontZlib(furIcons_compressed_data,furIcons_compressed_size,MAX(1,e->getConfInt("iconSize",16)*dpiScale),&fc))==NULL) { logE("could not load Furnace icons font!"); } @@ -7026,21 +6669,21 @@ void FurnaceGUI::applyUISettings(bool updateFonts) { patFont=mainFont; } else { if (settings.patFont==6) { // custom font - if ((patFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(settings.patFontPath.c_str(),MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fontConfP,upTo800))==NULL) { + if ((patFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(settings.patFontPath.c_str(),MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fontConfP))==NULL) { logW("could not load pattern font! reverting to default font"); settings.patFont=GUI_PAT_FONT_DEFAULT; - if ((patFont=addFontZlib(builtinFontM[settings.patFont],builtinFontMLen[settings.patFont],MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fontConfP,upTo800))==NULL) { + if ((patFont=addFontZlib(builtinFontM[settings.patFont],builtinFontMLen[settings.patFont],MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fontConfP))==NULL) { logE("could not load pattern font! falling back to Proggy Clean."); patFont=ImGui::GetIO().Fonts->AddFontDefault(); } } } else if (settings.patFont==5) { // system font - if ((patFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_PAT_FONT_PATH_1,MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fontConfP,upTo800))==NULL) { - if ((patFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_PAT_FONT_PATH_2,MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fontConfP,upTo800))==NULL) { - if ((patFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_PAT_FONT_PATH_3,MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fontConfP,upTo800))==NULL) { + if ((patFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_PAT_FONT_PATH_1,MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fontConfP))==NULL) { + if ((patFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_PAT_FONT_PATH_2,MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fontConfP))==NULL) { + if ((patFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_PAT_FONT_PATH_3,MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fontConfP))==NULL) { logW("could not load pattern font! reverting to default font"); settings.patFont=GUI_PAT_FONT_DEFAULT; - if ((patFont=addFontZlib(builtinFontM[settings.patFont],builtinFontMLen[settings.patFont],MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fontConfP,upTo800))==NULL) { + if ((patFont=addFontZlib(builtinFontM[settings.patFont],builtinFontMLen[settings.patFont],MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fontConfP))==NULL) { logE("could not load pattern font! falling back to Proggy Clean."); patFont=ImGui::GetIO().Fonts->AddFontDefault(); } @@ -7048,7 +6691,7 @@ void FurnaceGUI::applyUISettings(bool updateFonts) { } } } else { - if ((patFont=addFontZlib(builtinFontM[settings.patFont],builtinFontMLen[settings.patFont],MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fontConfP,upTo800))==NULL) { + if ((patFont=addFontZlib(builtinFontM[settings.patFont],builtinFontMLen[settings.patFont],MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fontConfP))==NULL) { logE("could not load pattern font!"); patFont=ImGui::GetIO().Fonts->AddFontDefault(); } @@ -7056,58 +6699,28 @@ void FurnaceGUI::applyUISettings(bool updateFonts) { } // four fallback fonts - if (settings.loadFallbackPat && (settings.loadJapanese || - settings.loadChinese || - settings.loadChineseTraditional || - settings.loadKorean || + if (settings.loadFallbackPat && ( localeRequiresJapanese || localeRequiresChinese || localeRequiresChineseTrad || localeRequiresKorean)) { - patFont=addFontZlib(font_plexMono_compressed_data,font_plexMono_compressed_size,MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fc1,fontRange); - patFont=addFontZlib(font_plexSansJP_compressed_data,font_plexSansJP_compressed_size,MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fc1,fontRange); - patFont=addFontZlib(font_plexSansKR_compressed_data,font_plexSansKR_compressed_size,MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fc1,fontRange); - patFont=addFontZlib(font_unifont_compressed_data,font_unifont_compressed_size,MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fc1,fontRange); + patFont=addFontZlib(font_plexMono_compressed_data,font_plexMono_compressed_size,MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fc1); + patFont=addFontZlib(font_plexSansJP_compressed_data,font_plexSansJP_compressed_size,MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fc1); + patFont=addFontZlib(font_plexSansKR_compressed_data,font_plexSansKR_compressed_size,MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fc1); + patFont=addFontZlib(font_unifont_compressed_data,font_unifont_compressed_size,MAX(1,e->getConfInt("patFontSize",18)*dpiScale),&fc1); } - // 0x39B = Λ - // Հայերեն - // 한국어 - // Русский - // č - // ń - // ไทย - static const ImWchar bigFontRange[]={0x20,0xFF,0x39b,0x39b,0x10d,0x10d,0x144,0x144,0x420,0x420,0x423,0x423,0x430,0x430,0x438,0x438,0x439,0x439,0x43a,0x43a,0x43d,0x43d,0x440,0x440,0x441,0x441,0x443,0x443,0x44c,0x44c,0x457,0x457,0x540,0x540,0x561,0x561,0x565,0x565,0x575,0x575,0x576,0x576,0x580,0x580,0xe17,0xe17,0xe22,0xe22,0xe44,0xe44,0x65e5,0x65e5,0x672c,0x672c,0x8a9e,0x8a9e,0xad6d,0xad6d,0xc5b4,0xc5b4,0xd55c,0xd55c,0}; - - ImFontGlyphRangesBuilder bigFontRangeB; - ImVector outRangeB; - - bigFontRangeB.AddRanges(bigFontRange); - if (!localeExtraRanges.empty()) { - bigFontRangeB.AddRanges(localeExtraRanges.data()); - } - // I'm terribly sorry - bigFontRangeB.UsedChars[0x80>>5]=0; - - bigFontRangeB.BuildRanges(&outRangeB); - if (fontRangeB!=NULL) delete[] fontRangeB; - fontRangeB=new ImWchar[outRangeB.size()]; - index=0; - for (ImWchar& i: outRangeB) { - fontRangeB[index++]=i; - } - - if ((bigFont=addFontZlib(font_plexSans_compressed_data,font_plexSans_compressed_size,MAX(1,40*dpiScale),&fontConfB,fontRangeB))==NULL) { + if ((bigFont=addFontZlib(font_plexSans_compressed_data,font_plexSans_compressed_size,MAX(1,40*dpiScale),&fontConfB))==NULL) { logE("could not load big UI font!"); } fontConfB.MergeMode=true; - if ((bigFont=addFontZlib(font_plexSansJP_compressed_data,font_plexSansJP_compressed_size,MAX(1,40*dpiScale),&fontConfB,fontRangeB))==NULL) { + if ((bigFont=addFontZlib(font_plexSansJP_compressed_data,font_plexSansJP_compressed_size,MAX(1,40*dpiScale),&fontConfB))==NULL) { logE("could not load big UI font (japanese)!"); } - if ((bigFont=addFontZlib(font_plexSansKR_compressed_data,font_plexSansKR_compressed_size,MAX(1,40*dpiScale),&fontConfB,fontRangeB))==NULL) { + if ((bigFont=addFontZlib(font_plexSansKR_compressed_data,font_plexSansKR_compressed_size,MAX(1,40*dpiScale),&fontConfB))==NULL) { logE("could not load big UI font (korean)!"); } - if ((bigFont=addFontZlib(font_unifont_compressed_data,font_unifont_compressed_size,MAX(1,40*dpiScale),&fontConfB,fontRangeB))==NULL) { + if ((bigFont=addFontZlib(font_unifont_compressed_data,font_unifont_compressed_size,MAX(1,40*dpiScale),&fontConfB))==NULL) { logE("could not load big UI font (fallback)!"); } @@ -7116,21 +6729,21 @@ void FurnaceGUI::applyUISettings(bool updateFonts) { headFont=mainFont; } else { if (settings.headFont==6) { // custom font - if ((headFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(settings.headFontPath.c_str(),MAX(1,e->getConfInt("headFontSize",27)*dpiScale),&fontConfH,upTo800))==NULL) { + if ((headFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(settings.headFontPath.c_str(),MAX(1,e->getConfInt("headFontSize",27)*dpiScale),&fontConfH))==NULL) { logW("could not load header font! reverting to default font"); settings.headFont=0; - if ((headFont=addFontZlib(builtinFont[settings.headFont],builtinFontLen[settings.headFont],MAX(1,e->getConfInt("headFontSize",27)*dpiScale),&fontConfH,upTo800))==NULL) { + if ((headFont=addFontZlib(builtinFont[settings.headFont],builtinFontLen[settings.headFont],MAX(1,e->getConfInt("headFontSize",27)*dpiScale),&fontConfH))==NULL) { logE("could not load header font! falling back to IBM Plex Sans."); headFont=ImGui::GetIO().Fonts->AddFontDefault(); } } } else if (settings.headFont==5) { // system font - if ((headFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_HEAD_FONT_PATH_1,MAX(1,e->getConfInt("headFontSize",27)*dpiScale),&fontConfH,upTo800))==NULL) { - if ((headFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_HEAD_FONT_PATH_2,MAX(1,e->getConfInt("headFontSize",27)*dpiScale),&fontConfH,upTo800))==NULL) { - if ((headFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_HEAD_FONT_PATH_3,MAX(1,e->getConfInt("headFontSize",27)*dpiScale),&fontConfH,upTo800))==NULL) { + if ((headFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_HEAD_FONT_PATH_1,MAX(1,e->getConfInt("headFontSize",27)*dpiScale),&fontConfH))==NULL) { + if ((headFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_HEAD_FONT_PATH_2,MAX(1,e->getConfInt("headFontSize",27)*dpiScale),&fontConfH))==NULL) { + if ((headFont=ImGui::GetIO().Fonts->AddFontFromFileTTF(SYSTEM_HEAD_FONT_PATH_3,MAX(1,e->getConfInt("headFontSize",27)*dpiScale),&fontConfH))==NULL) { logW("could not load header font! reverting to default font"); settings.headFont=0; - if ((headFont=addFontZlib(builtinFont[settings.headFont],builtinFontLen[settings.headFont],MAX(1,e->getConfInt("headFontSize",27)*dpiScale),&fontConfH,upTo800))==NULL) { + if ((headFont=addFontZlib(builtinFont[settings.headFont],builtinFontLen[settings.headFont],MAX(1,e->getConfInt("headFontSize",27)*dpiScale),&fontConfH))==NULL) { logE("could not load header font! falling back to IBM Plex Sans."); headFont=ImGui::GetIO().Fonts->AddFontDefault(); } @@ -7138,7 +6751,7 @@ void FurnaceGUI::applyUISettings(bool updateFonts) { } } } else { - if ((headFont=addFontZlib(builtinFont[settings.headFont],builtinFontLen[settings.headFont],MAX(1,e->getConfInt("headFontSize",27)*dpiScale),&fontConfH,upTo800))==NULL) { + if ((headFont=addFontZlib(builtinFont[settings.headFont],builtinFontLen[settings.headFont],MAX(1,e->getConfInt("headFontSize",27)*dpiScale),&fontConfH))==NULL) { logE("could not load header font!"); headFont=ImGui::GetIO().Fonts->AddFontDefault(); } @@ -7147,7 +6760,7 @@ void FurnaceGUI::applyUISettings(bool updateFonts) { mainFont->FallbackChar='?'; mainFont->EllipsisChar='.'; - mainFont->EllipsisCharCount=3; + //mainFont->EllipsisCharCount=3; } else if (updateFonts) { // safe mode mainFont=ImGui::GetIO().Fonts->AddFontDefault(); @@ -7157,33 +6770,32 @@ void FurnaceGUI::applyUISettings(bool updateFonts) { mainFont->FallbackChar='?'; mainFont->EllipsisChar='.'; - mainFont->EllipsisCharCount=3; + //mainFont->EllipsisCharCount=3; } - - ImGuiFileDialog::Instance()->okButtonString=_("OK"); - ImGuiFileDialog::Instance()->cancelButtonString=_("Cancel"); - ImGuiFileDialog::Instance()->searchString=_("Search"); - ImGuiFileDialog::Instance()->dirEntryString=_("[Dir]"); - ImGuiFileDialog::Instance()->linkEntryString=_("[Link]"); - ImGuiFileDialog::Instance()->fileEntryString=_("[File]"); - ImGuiFileDialog::Instance()->fileNameString=_("Name:"); - ImGuiFileDialog::Instance()->dirNameString=_("Path:"); - ImGuiFileDialog::Instance()->buttonResetSearchString=_("Reset search"); - ImGuiFileDialog::Instance()->buttonDriveString=_("Drives"); - ImGuiFileDialog::Instance()->buttonEditPathString=_("Edit path\nYou can also right click on path buttons"); - ImGuiFileDialog::Instance()->buttonResetPathString=_("Go to home directory"); - ImGuiFileDialog::Instance()->buttonParentDirString=_("Go to parent directory"); - ImGuiFileDialog::Instance()->buttonCreateDirString=_("Create Directory"); - ImGuiFileDialog::Instance()->tableHeaderFileNameString=_("File name"); - ImGuiFileDialog::Instance()->tableHeaderFileTypeString=_("Type"); - ImGuiFileDialog::Instance()->tableHeaderFileSizeString=_("Size"); - ImGuiFileDialog::Instance()->tableHeaderFileDateString=_("Date"); - ImGuiFileDialog::Instance()->OverWriteDialogTitleString=_("Warning"); - ImGuiFileDialog::Instance()->OverWriteDialogMessageString=_("The file you selected already exists! Would you like to overwrite it?"); - ImGuiFileDialog::Instance()->OverWriteDialogConfirmButtonString=_("Yes"); - ImGuiFileDialog::Instance()->OverWriteDialogCancelButtonString=_("No"); - ImGuiFileDialog::Instance()->DateTimeFormat=_("%Y/%m/%d %H:%M"); + ImGuiFileDialog::Instance()->okButtonString=_("OK"); + ImGuiFileDialog::Instance()->cancelButtonString=_("Cancel"); + ImGuiFileDialog::Instance()->searchString=_("Search"); + ImGuiFileDialog::Instance()->dirEntryString=_("[Dir]"); + ImGuiFileDialog::Instance()->linkEntryString=_("[Link]"); + ImGuiFileDialog::Instance()->fileEntryString=_("[File]"); + ImGuiFileDialog::Instance()->fileNameString=_("Name:"); + ImGuiFileDialog::Instance()->dirNameString=_("Path:"); + ImGuiFileDialog::Instance()->buttonResetSearchString=_("Reset search"); + ImGuiFileDialog::Instance()->buttonDriveString=_("Drives"); + ImGuiFileDialog::Instance()->buttonEditPathString=_("Edit path\nYou can also right click on path buttons"); + ImGuiFileDialog::Instance()->buttonResetPathString=_("Go to home directory"); + ImGuiFileDialog::Instance()->buttonParentDirString=_("Go to parent directory"); + ImGuiFileDialog::Instance()->buttonCreateDirString=_("Create Directory"); + ImGuiFileDialog::Instance()->tableHeaderFileNameString=_("File name"); + ImGuiFileDialog::Instance()->tableHeaderFileTypeString=_("Type"); + ImGuiFileDialog::Instance()->tableHeaderFileSizeString=_("Size"); + ImGuiFileDialog::Instance()->tableHeaderFileDateString=_("Date"); + ImGuiFileDialog::Instance()->OverWriteDialogTitleString=_("Warning"); + ImGuiFileDialog::Instance()->OverWriteDialogMessageString=_("The file you selected already exists! Would you like to overwrite it?"); + ImGuiFileDialog::Instance()->OverWriteDialogConfirmButtonString=_("Yes"); + ImGuiFileDialog::Instance()->OverWriteDialogCancelButtonString=_("No"); + ImGuiFileDialog::Instance()->DateTimeFormat=_("%Y/%m/%d %H:%M"); ImGuiFileDialog::Instance()->SetFileStyle(IGFD_FileStyleByTypeDir,"",uiColors[GUI_COLOR_FILE_DIR],ICON_FA_FOLDER_O); ImGuiFileDialog::Instance()->SetFileStyle(IGFD_FileStyleByTypeFile,"",uiColors[GUI_COLOR_FILE_OTHER],ICON_FA_FILE_O);