From 765617d53860a46b15a3a6cc519978ed13252bd5 Mon Sep 17 00:00:00 2001 From: Nanako <469449812@qq.com> Date: Fri, 28 Mar 2025 15:51:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=90=E5=83=8F=E7=B4=A0=E6=B8=B2=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 1 + cmake/mingw_dll.cmake | 29 +++++++++++++++++++ example/CMakeLists.txt | 2 ++ example/src/main.cpp | 2 +- .../standard_bitmap_renderer.cpp | 9 ++++-- src/mirage_render/shaders/mirage_text.slang | 4 ++- 6 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 cmake/mingw_dll.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 604275e..8b95b14 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,7 @@ include(cmake/retrieve_files.cmake) include(cmake/detect_os.cmake) include(cmake/config_macos.cmake) include(cmake/compile_shaders.cmake) +include(cmake/mingw_dll.cmake) # 如果是Debug模式, 添加宏定义 if (CMAKE_BUILD_TYPE STREQUAL "Debug") diff --git a/cmake/mingw_dll.cmake b/cmake/mingw_dll.cmake new file mode 100644 index 0000000..b2f03c9 --- /dev/null +++ b/cmake/mingw_dll.cmake @@ -0,0 +1,29 @@ + +function(auto_copy_mingw_dll target) + if(MINGW) + # 获取MinGW目录 + get_filename_component(MINGW_DIR ${CMAKE_CXX_COMPILER} PATH) + + # 根据你的环境调整DLL列表 + set(MINGW_DLLS + "libstdc++-6.dll" +# "libgcc_s_dw2-1.dll" + "libgcc_s_seh-1.dll" + "libwinpthread-1.dll" + ) + + foreach(DLL ${MINGW_DLLS}) + # 检查文件是否存在 + if(EXISTS "${MINGW_DIR}/${DLL}") + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${MINGW_DIR}/${DLL}" + "$" + COMMENT "Copying ${DLL} to output directory" + VERBATIM) + else() + message(WARNING "DLL not found: ${MINGW_DIR}/${DLL}") + endif() + endforeach() + endif() +endfunction() \ No newline at end of file diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 31b791a..77cde35 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -8,3 +8,5 @@ target_link_libraries(${PROJECT_NAME} PRIVATE mirage_app) if (MSVC) target_link_options(${PROJECT_NAME} PRIVATE "/SUBSYSTEM:WINDOWS" "/ENTRY:mainCRTStartup") endif() + +auto_copy_mingw_dll(${PROJECT_NAME}) diff --git a/example/src/main.cpp b/example/src/main.cpp index 3717ddc..eb2c068 100644 --- a/example/src/main.cpp +++ b/example/src/main.cpp @@ -10,7 +10,7 @@ int main(int argc, char* argv[]) { mirage_app::get().init(); auto& manager = font_manager::instance(); - manager.add_font(L"C:/Users/46944/AppData/Local/Microsoft/Windows/Fonts/MapleMono-NF-CN-Regular.ttf"); + // manager.add_font(L"C:/Users/46944/AppData/Local/Microsoft/Windows/Fonts/MapleMono-NF-CN-Regular.ttf"); manager.add_font(L"C:/Windows/Fonts/msyh.ttc"); manager.add_font(L"C:/Windows/Fonts/seguiemj.ttf"); diff --git a/src/mirage_render/font/font_renderer/standard_bitmap_renderer.cpp b/src/mirage_render/font/font_renderer/standard_bitmap_renderer.cpp index 926bca5..0e93cdc 100644 --- a/src/mirage_render/font/font_renderer/standard_bitmap_renderer.cpp +++ b/src/mirage_render/font/font_renderer/standard_bitmap_renderer.cpp @@ -14,7 +14,11 @@ std::optional standard_bitmap_renderer_t::render_bitmap( // 获取字形边界 int x0, y0, x1, y1; - stbtt_GetGlyphBitmapBox(&font_info, glyph_index, scale, scale, &x0, &y0, &x1, &y1); + stbtt_GetGlyphBitmapBoxSubpixel(&font_info, + glyph_index, + scale, scale, + 0.5f, 0, + &x0, &y0, &x1, &y1); const int width = x1 - x0; const int height = y1 - y0; @@ -33,11 +37,12 @@ std::optional standard_bitmap_renderer_t::render_bitmap( bitmap.data.resize(width * height); // 渲染字形 - stbtt_MakeGlyphBitmap( + stbtt_MakeGlyphBitmapSubpixel( &font_info, bitmap.data.data(), width, height, width, scale, scale, + 0.5f, 0, glyph_index ); diff --git a/src/mirage_render/shaders/mirage_text.slang b/src/mirage_render/shaders/mirage_text.slang index 2760481..f59d0e9 100644 --- a/src/mirage_render/shaders/mirage_text.slang +++ b/src/mirage_render/shaders/mirage_text.slang @@ -31,5 +31,7 @@ PSInput vertex_main(VSInput input) float4 pixel_main(PSInput input) : SV_Target { float4 color = texture.Sample(textureSampler, input.uv); - return float4(color.r) * input.color; + float4 final_color = input.color; + final_color.a *= color.r; + return final_color; }