diff --git a/.gitmodules b/.gitmodules index e69de29..9ac60b3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "third_party/freetype"] + path = third_party/freetype + url = https://github.com/freetype/freetype +[submodule "third_party/harfbuzz"] + path = third_party/harfbuzz + url = https://github.com/harfbuzz/harfbuzz diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b95b14..556586d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,9 +50,10 @@ else () endif () add_subdirectory(src/sokol) +add_subdirectory(third_party/freetype) +add_subdirectory(third_party/harfbuzz) add_subdirectory(src/mirage_render) add_subdirectory(src/mirage_image) -add_subdirectory(src/mirage_stb_image_loader) add_subdirectory(src/mirage_core) add_subdirectory(src/mirage_widget) add_subdirectory(src/mirage_app) diff --git a/example/src/main.cpp b/example/src/main.cpp index 5ea8e34..018a203 100644 --- a/example/src/main.cpp +++ b/example/src/main.cpp @@ -1,14 +1,66 @@ +#include + #include "mirage.h" #include "window/mwindow.h" #include "font/font_system.h" +#include "font/font_renderer/colr_renderer.h" #include "widget/widget_new.h" #include "widget/compound_widget/mbutton.h" #include "widget/leaf_widget/mtext_block.h" #include "widget/panel_widget/mbox.h" +#include "freetype/freetype.h" +#include "freetype/ftlcdfil.h" + int main(int argc, char* argv[]) { mirage_app::get().init(); + FT_Library ft_library; + if (FT_Init_FreeType(&ft_library)) { + std::cerr << "Failed to initialize FreeType library" << std::endl; + return -1; + } + FT_Library_SetLcdFilter(ft_library, FT_LCD_FILTER_DEFAULT); + FT_Face ft_face; + if (FT_New_Face(ft_library, "C:/Windows/Fonts/msyh.ttc", 0, &ft_face)) { + std::cerr << "Failed to load font face" << std::endl; + return -1; + } + FT_Library_SetLcdFilterWeights(ft_library, nullptr); + FT_Library_SetLcdGeometry(ft_library, nullptr); + FT_Library_SetLcdFilter(ft_library, FT_LCD_FILTER_DEFAULT); + + // 渲染一个字符 + FT_Set_Pixel_Sizes(ft_face, 0, 24); + FT_Load_Char(ft_face, U'你', FT_LOAD_RENDER); + FT_Render_Glyph(ft_face->glyph, FT_RENDER_MODE_LCD); + + // 获取渲染的位图 + FT_Bitmap bitmap = ft_face->glyph->bitmap; + if (bitmap.buffer) { + std::cout << "Bitmap width: " << bitmap.width << ", height: " << bitmap.rows << std::endl; + } else { + std::cerr << "Failed to get bitmap" << std::endl; + } + + // 保存位图到文件 + color_emoji_bitmap_t bitmap_; + // 将bitmap数据转换为color_emoji_bitmap_t格式 + bitmap_.width = bitmap.width; + bitmap_.height = bitmap.rows; + bitmap_.data.resize(bitmap.width * bitmap.rows * 4); // RGBA格式 + for (int y = 0; y < bitmap.rows; ++y) { + for (int x = 0; x < bitmap.width; ++x) { + int index = y * bitmap.width + x; + bitmap_.data[index * 4 + 0] = bitmap.buffer[index]; // R + bitmap_.data[index * 4 + 1] = bitmap.buffer[index]; // G + bitmap_.data[index * 4 + 2] = bitmap.buffer[index]; // B + bitmap_.data[index * 4 + 3] = bitmap.buffer[index]; // A + } + } + save_bitmap("output.bmp", bitmap_); + FT_Done_Face(ft_face); + 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:/Windows/Fonts/msyh.ttc"); diff --git a/src/mirage_core/CMakeLists.txt b/src/mirage_core/CMakeLists.txt index df86a69..2734971 100644 --- a/src/mirage_core/CMakeLists.txt +++ b/src/mirage_core/CMakeLists.txt @@ -2,14 +2,13 @@ cmake_minimum_required(VERSION 3.15) project(mirage_core LANGUAGES C CXX) -find_package(Freetype REQUIRED) find_package(Eigen3 REQUIRED) set(SRC_FILES) retrieve_files(${CMAKE_CURRENT_SOURCE_DIR} SRC_FILES) add_library(${PROJECT_NAME} STATIC ${SRC_FILES}) -target_link_libraries(${PROJECT_NAME} PUBLIC Freetype::Freetype Eigen3::Eigen mirage_image) +target_link_libraries(${PROJECT_NAME} PUBLIC Eigen3::Eigen mirage_image) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) add_os_definitions(${PROJECT_NAME}) target_compile_definitions(${PROJECT_NAME} PUBLIC -DNOMINMAX) diff --git a/src/mirage_core/misc/mapped_file/mapped_file.h b/src/mirage_core/misc/mapped_file/mapped_file.h index fc05274..fc62576 100644 --- a/src/mirage_core/misc/mapped_file/mapped_file.h +++ b/src/mirage_core/misc/mapped_file/mapped_file.h @@ -4,6 +4,7 @@ #include #include #include +#include class mapped_file { public: @@ -21,5 +22,19 @@ public: [[nodiscard]] virtual size_t get_size() const = 0; [[nodiscard]] virtual bool is_mapped() const = 0; + [[nodiscard]] std::span get_span() const { + return std::span(static_cast(get_data()), get_size()); + } + [[nodiscard]] std::span get_span() { + return std::span(static_cast(get_data()), get_size()); + } + + [[nodiscard]] uint8_t* get_u8() { + return static_cast(get_data()); + } + [[nodiscard]] const uint8_t* get_u8() const { + return static_cast(get_data()); + } + static std::unique_ptr create(); }; diff --git a/src/mirage_render/CMakeLists.txt b/src/mirage_render/CMakeLists.txt index fee375f..15151ea 100644 --- a/src/mirage_render/CMakeLists.txt +++ b/src/mirage_render/CMakeLists.txt @@ -1,19 +1,14 @@ project(mirage_render) + set(SOURCE_FILES) -retrieve_files(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_FILES) +retrieve_files(${CMAKE_CURRENT_SOURCE_DIR}/src SOURCE_FILES) add_library(${PROJECT_NAME} STATIC ${SOURCE_FILES}) -target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(${PROJECT_NAME} PUBLIC mirage_core sokol) +target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src) +target_link_libraries(${PROJECT_NAME} PUBLIC mirage_core sokol freetype) -option(MIRAGE_STB_IMAGE_LOADER "Use stb load image" ON) option(MIRAGE_SVG_EMOJI "Use svg emoji" ON) - -if (MIRAGE_STB_IMAGE_LOADER) - target_link_libraries(${PROJECT_NAME} PUBLIC mirage_stb_image_loader) - target_compile_definitions(${PROJECT_NAME} PUBLIC HAS_STB_IMAGE) -endif () if (MIRAGE_SVG_EMOJI) find_package(nanosvg REQUIRED) find_package(ZLIB REQUIRED) @@ -21,6 +16,14 @@ if (MIRAGE_SVG_EMOJI) target_compile_definitions(${PROJECT_NAME} PUBLIC HAS_NANOSVG) endif () +option(MIRAGE_STB_IMAGE_LOADER "Use stb load image" ON) +if (MIRAGE_STB_IMAGE_LOADER) + add_subdirectory(stb_image_loader) + target_link_libraries(${PROJECT_NAME} PUBLIC stb_image_loader) + target_compile_definitions(${PROJECT_NAME} PUBLIC HAS_STB_IMAGE) +endif () + + # 添加编译shader的自定义命令 add_mirage_shader_directory(${CMAKE_CURRENT_SOURCE_DIR}/shaders) add_shader_dependencies(${PROJECT_NAME}) diff --git a/src/mirage_render/font/atlas/bitmap_glyph_atlas.h b/src/mirage_render/src/font/atlas/bitmap_glyph_atlas.h similarity index 100% rename from src/mirage_render/font/atlas/bitmap_glyph_atlas.h rename to src/mirage_render/src/font/atlas/bitmap_glyph_atlas.h diff --git a/src/mirage_render/font/atlas/color_emoji_atlas.h b/src/mirage_render/src/font/atlas/color_emoji_atlas.h similarity index 100% rename from src/mirage_render/font/atlas/color_emoji_atlas.h rename to src/mirage_render/src/font/atlas/color_emoji_atlas.h diff --git a/src/mirage_render/font/atlas/font_atlas.h b/src/mirage_render/src/font/atlas/font_atlas.h similarity index 100% rename from src/mirage_render/font/atlas/font_atlas.h rename to src/mirage_render/src/font/atlas/font_atlas.h diff --git a/src/mirage_render/font/atlas/font_atlas_manager.cpp b/src/mirage_render/src/font/atlas/font_atlas_manager.cpp similarity index 100% rename from src/mirage_render/font/atlas/font_atlas_manager.cpp rename to src/mirage_render/src/font/atlas/font_atlas_manager.cpp diff --git a/src/mirage_render/font/atlas/font_atlas_manager.h b/src/mirage_render/src/font/atlas/font_atlas_manager.h similarity index 100% rename from src/mirage_render/font/atlas/font_atlas_manager.h rename to src/mirage_render/src/font/atlas/font_atlas_manager.h diff --git a/src/mirage_render/font/emoji_detector.h b/src/mirage_render/src/font/emoji_detector.h similarity index 100% rename from src/mirage_render/font/emoji_detector.h rename to src/mirage_render/src/font/emoji_detector.h diff --git a/src/mirage_render/font/font_face.cpp b/src/mirage_render/src/font/font_face.cpp similarity index 100% rename from src/mirage_render/font/font_face.cpp rename to src/mirage_render/src/font/font_face.cpp diff --git a/src/mirage_render/font/font_face.h b/src/mirage_render/src/font/font_face.h similarity index 100% rename from src/mirage_render/font/font_face.h rename to src/mirage_render/src/font/font_face.h diff --git a/src/mirage_render/font/font_renderer/cbdt_renderer.cpp b/src/mirage_render/src/font/font_renderer/cbdt_renderer.cpp similarity index 100% rename from src/mirage_render/font/font_renderer/cbdt_renderer.cpp rename to src/mirage_render/src/font/font_renderer/cbdt_renderer.cpp diff --git a/src/mirage_render/font/font_renderer/cbdt_renderer.h b/src/mirage_render/src/font/font_renderer/cbdt_renderer.h similarity index 100% rename from src/mirage_render/font/font_renderer/cbdt_renderer.h rename to src/mirage_render/src/font/font_renderer/cbdt_renderer.h diff --git a/src/mirage_render/font/font_renderer/colr_renderer.cpp b/src/mirage_render/src/font/font_renderer/colr_renderer.cpp similarity index 100% rename from src/mirage_render/font/font_renderer/colr_renderer.cpp rename to src/mirage_render/src/font/font_renderer/colr_renderer.cpp diff --git a/src/mirage_render/font/font_renderer/colr_renderer.h b/src/mirage_render/src/font/font_renderer/colr_renderer.h similarity index 92% rename from src/mirage_render/font/font_renderer/colr_renderer.h rename to src/mirage_render/src/font/font_renderer/colr_renderer.h index c5ad674..c2899f5 100644 --- a/src/mirage_render/font/font_renderer/colr_renderer.h +++ b/src/mirage_render/src/font/font_renderer/colr_renderer.h @@ -2,6 +2,8 @@ #include "font_renderer.h" #include "font/stb_truetype.h" +void save_bitmap(const std::string& filename, const color_emoji_bitmap_t& bitmap); + /** * @class colr_renderer_t * @brief 基于COLR/CPAL表的彩色表情渲染器 diff --git a/src/mirage_render/font/font_renderer/font_renderer.h b/src/mirage_render/src/font/font_renderer/font_renderer.h similarity index 100% rename from src/mirage_render/font/font_renderer/font_renderer.h rename to src/mirage_render/src/font/font_renderer/font_renderer.h diff --git a/src/mirage_render/font/font_renderer/sbix_renderer.cpp b/src/mirage_render/src/font/font_renderer/sbix_renderer.cpp similarity index 100% rename from src/mirage_render/font/font_renderer/sbix_renderer.cpp rename to src/mirage_render/src/font/font_renderer/sbix_renderer.cpp diff --git a/src/mirage_render/font/font_renderer/sbix_renderer.h b/src/mirage_render/src/font/font_renderer/sbix_renderer.h similarity index 100% rename from src/mirage_render/font/font_renderer/sbix_renderer.h rename to src/mirage_render/src/font/font_renderer/sbix_renderer.h diff --git a/src/mirage_render/font/font_renderer/standard_bitmap_renderer.cpp b/src/mirage_render/src/font/font_renderer/standard_bitmap_renderer.cpp similarity index 100% rename from src/mirage_render/font/font_renderer/standard_bitmap_renderer.cpp rename to src/mirage_render/src/font/font_renderer/standard_bitmap_renderer.cpp diff --git a/src/mirage_render/font/font_renderer/standard_bitmap_renderer.h b/src/mirage_render/src/font/font_renderer/standard_bitmap_renderer.h similarity index 100% rename from src/mirage_render/font/font_renderer/standard_bitmap_renderer.h rename to src/mirage_render/src/font/font_renderer/standard_bitmap_renderer.h diff --git a/src/mirage_render/font/font_renderer/svg_renderer.cpp b/src/mirage_render/src/font/font_renderer/svg_renderer.cpp similarity index 100% rename from src/mirage_render/font/font_renderer/svg_renderer.cpp rename to src/mirage_render/src/font/font_renderer/svg_renderer.cpp diff --git a/src/mirage_render/font/font_renderer/svg_renderer.h b/src/mirage_render/src/font/font_renderer/svg_renderer.h similarity index 100% rename from src/mirage_render/font/font_renderer/svg_renderer.h rename to src/mirage_render/src/font/font_renderer/svg_renderer.h diff --git a/src/mirage_render/font/font_system.cpp b/src/mirage_render/src/font/font_system.cpp similarity index 100% rename from src/mirage_render/font/font_system.cpp rename to src/mirage_render/src/font/font_system.cpp diff --git a/src/mirage_render/font/font_system.h b/src/mirage_render/src/font/font_system.h similarity index 100% rename from src/mirage_render/font/font_system.h rename to src/mirage_render/src/font/font_system.h diff --git a/src/mirage_render/font/font_type.h b/src/mirage_render/src/font/font_type.h similarity index 100% rename from src/mirage_render/font/font_type.h rename to src/mirage_render/src/font/font_type.h diff --git a/src/mirage_render/font/font_utils.h b/src/mirage_render/src/font/font_utils.h similarity index 100% rename from src/mirage_render/font/font_utils.h rename to src/mirage_render/src/font/font_utils.h diff --git a/src/mirage_render/font/stb_truetype.h b/src/mirage_render/src/font/stb_truetype.h similarity index 100% rename from src/mirage_render/font/stb_truetype.h rename to src/mirage_render/src/font/stb_truetype.h diff --git a/src/mirage_render/src/interface/image_interface.h b/src/mirage_render/src/interface/image_interface.h new file mode 100644 index 0000000..0d8d0b9 --- /dev/null +++ b/src/mirage_render/src/interface/image_interface.h @@ -0,0 +1,28 @@ +#pragma once +#include +#include +#include + +#include "pixel.h" +#include "sokol_gfx.h" +#include "misc/mapped_file/mapped_file.h" + +struct image_heap_t { + int32_t width; // 图像宽度 + int32_t height; // 图像高度 + sg_pixel_format pixel_format; // 像素格式 + void* data; // 图像数据指针 + + template + image_accessor

make_accessor() { + return image_accessor

(data, width, height); + } +}; + +std::shared_ptr load_image(const std::span& in_raw_data); +inline std::shared_ptr load_image(const std::filesystem::path& in_file) { + auto mapped = mapped_file::create(); + if (!mapped->map_file(in_file)) + return nullptr; + return load_image(mapped->get_span()); +} diff --git a/src/mirage_render/platform_window/platform_window.cpp b/src/mirage_render/src/platform_window/platform_window.cpp similarity index 100% rename from src/mirage_render/platform_window/platform_window.cpp rename to src/mirage_render/src/platform_window/platform_window.cpp diff --git a/src/mirage_render/platform_window/platform_window.h b/src/mirage_render/src/platform_window/platform_window.h similarity index 100% rename from src/mirage_render/platform_window/platform_window.h rename to src/mirage_render/src/platform_window/platform_window.h diff --git a/src/mirage_render/platform_window/windows/windows_window.cpp b/src/mirage_render/src/platform_window/windows/windows_window.cpp similarity index 100% rename from src/mirage_render/platform_window/windows/windows_window.cpp rename to src/mirage_render/src/platform_window/windows/windows_window.cpp diff --git a/src/mirage_render/render/mirage_paint_context.cpp b/src/mirage_render/src/render/mirage_paint_context.cpp similarity index 100% rename from src/mirage_render/render/mirage_paint_context.cpp rename to src/mirage_render/src/render/mirage_paint_context.cpp diff --git a/src/mirage_render/render/mirage_paint_context.h b/src/mirage_render/src/render/mirage_paint_context.h similarity index 100% rename from src/mirage_render/render/mirage_paint_context.h rename to src/mirage_render/src/render/mirage_paint_context.h diff --git a/src/mirage_render/render/render_context.h b/src/mirage_render/src/render/render_context.h similarity index 100% rename from src/mirage_render/render/render_context.h rename to src/mirage_render/src/render/render_context.h diff --git a/src/mirage_render/render/render_elements.cpp b/src/mirage_render/src/render/render_elements.cpp similarity index 100% rename from src/mirage_render/render/render_elements.cpp rename to src/mirage_render/src/render/render_elements.cpp diff --git a/src/mirage_render/render/render_elements.h b/src/mirage_render/src/render/render_elements.h similarity index 100% rename from src/mirage_render/render/render_elements.h rename to src/mirage_render/src/render/render_elements.h diff --git a/src/mirage_render/render/texture_sampler.h b/src/mirage_render/src/render/texture_sampler.h similarity index 98% rename from src/mirage_render/render/texture_sampler.h rename to src/mirage_render/src/render/texture_sampler.h index 21b6581..d63d8ff 100644 --- a/src/mirage_render/render/texture_sampler.h +++ b/src/mirage_render/src/render/texture_sampler.h @@ -1,6 +1,6 @@ #pragma once /** - * @file sampler.h + * @file texture_sampler.h * @brief 跨平台纹理采样器抽象 */ @@ -210,13 +210,13 @@ public: * @brief 构建最终的采样器描述符 * @return 完整的采样器描述符,可用于sg_make_sampler */ - sg_sampler_desc build() const; + [[nodiscard]] sg_sampler_desc build() const; /** * @brief 创建纹理采样器 * @return 纹理采样器指针 */ - std::shared_ptr create() const; + [[nodiscard]] std::shared_ptr create() const; static std::shared_ptr get_sampler(sampler_type in_type); static void clear(); diff --git a/src/mirage_render/render/windows/pixel_format_convert.h b/src/mirage_render/src/render/windows/pixel_format_convert.h similarity index 100% rename from src/mirage_render/render/windows/pixel_format_convert.h rename to src/mirage_render/src/render/windows/pixel_format_convert.h diff --git a/src/mirage_render/render/windows/texture_sampler.cpp b/src/mirage_render/src/render/windows/texture_sampler.cpp similarity index 100% rename from src/mirage_render/render/windows/texture_sampler.cpp rename to src/mirage_render/src/render/windows/texture_sampler.cpp diff --git a/src/mirage_render/render/windows/windows_render_context.cpp b/src/mirage_render/src/render/windows/windows_render_context.cpp similarity index 100% rename from src/mirage_render/render/windows/windows_render_context.cpp rename to src/mirage_render/src/render/windows/windows_render_context.cpp diff --git a/src/mirage_render/render/windows/windows_render_context.h b/src/mirage_render/src/render/windows/windows_render_context.h similarity index 100% rename from src/mirage_render/render/windows/windows_render_context.h rename to src/mirage_render/src/render/windows/windows_render_context.h diff --git a/src/mirage_render/render/windows/windows_render_state.cpp b/src/mirage_render/src/render/windows/windows_render_state.cpp similarity index 100% rename from src/mirage_render/render/windows/windows_render_state.cpp rename to src/mirage_render/src/render/windows/windows_render_state.cpp diff --git a/src/mirage_render/render/windows/windows_render_state.h b/src/mirage_render/src/render/windows/windows_render_state.h similarity index 100% rename from src/mirage_render/render/windows/windows_render_state.h rename to src/mirage_render/src/render/windows/windows_render_state.h diff --git a/src/mirage_render/shaders/mirage_image.slang b/src/mirage_render/src/shaders/mirage_image.slang similarity index 100% rename from src/mirage_render/shaders/mirage_image.slang rename to src/mirage_render/src/shaders/mirage_image.slang diff --git a/src/mirage_render/shaders/mirage_line.slang b/src/mirage_render/src/shaders/mirage_line.slang similarity index 100% rename from src/mirage_render/shaders/mirage_line.slang rename to src/mirage_render/src/shaders/mirage_line.slang diff --git a/src/mirage_render/shaders/mirage_rounded_rect.slang b/src/mirage_render/src/shaders/mirage_rounded_rect.slang similarity index 100% rename from src/mirage_render/shaders/mirage_rounded_rect.slang rename to src/mirage_render/src/shaders/mirage_rounded_rect.slang diff --git a/src/mirage_render/shaders/mirage_text.slang b/src/mirage_render/src/shaders/mirage_text.slang similarity index 100% rename from src/mirage_render/shaders/mirage_text.slang rename to src/mirage_render/src/shaders/mirage_text.slang diff --git a/src/mirage_render/shaders/mirage_util.slang b/src/mirage_render/src/shaders/mirage_util.slang similarity index 100% rename from src/mirage_render/shaders/mirage_util.slang rename to src/mirage_render/src/shaders/mirage_util.slang diff --git a/src/mirage_render/shaders/mirage_wireframe.slang b/src/mirage_render/src/shaders/mirage_wireframe.slang similarity index 100% rename from src/mirage_render/shaders/mirage_wireframe.slang rename to src/mirage_render/src/shaders/mirage_wireframe.slang diff --git a/src/mirage_render/texture/atlas/atlas_allocator.h b/src/mirage_render/src/texture/atlas/atlas_allocator.h similarity index 100% rename from src/mirage_render/texture/atlas/atlas_allocator.h rename to src/mirage_render/src/texture/atlas/atlas_allocator.h diff --git a/src/mirage_render/texture/atlas/bin_packing_allocator.cpp b/src/mirage_render/src/texture/atlas/bin_packing_allocator.cpp similarity index 100% rename from src/mirage_render/texture/atlas/bin_packing_allocator.cpp rename to src/mirage_render/src/texture/atlas/bin_packing_allocator.cpp diff --git a/src/mirage_render/texture/atlas/bin_packing_allocator.h b/src/mirage_render/src/texture/atlas/bin_packing_allocator.h similarity index 100% rename from src/mirage_render/texture/atlas/bin_packing_allocator.h rename to src/mirage_render/src/texture/atlas/bin_packing_allocator.h diff --git a/src/mirage_render/texture/atlas/grid_allocator.cpp b/src/mirage_render/src/texture/atlas/grid_allocator.cpp similarity index 100% rename from src/mirage_render/texture/atlas/grid_allocator.cpp rename to src/mirage_render/src/texture/atlas/grid_allocator.cpp diff --git a/src/mirage_render/texture/atlas/grid_allocator.h b/src/mirage_render/src/texture/atlas/grid_allocator.h similarity index 100% rename from src/mirage_render/texture/atlas/grid_allocator.h rename to src/mirage_render/src/texture/atlas/grid_allocator.h diff --git a/src/mirage_render/texture/atlas/skyline_allocator.cpp b/src/mirage_render/src/texture/atlas/skyline_allocator.cpp similarity index 100% rename from src/mirage_render/texture/atlas/skyline_allocator.cpp rename to src/mirage_render/src/texture/atlas/skyline_allocator.cpp diff --git a/src/mirage_render/texture/atlas/skyline_allocator.h b/src/mirage_render/src/texture/atlas/skyline_allocator.h similarity index 100% rename from src/mirage_render/texture/atlas/skyline_allocator.h rename to src/mirage_render/src/texture/atlas/skyline_allocator.h diff --git a/src/mirage_render/texture/atlas/texture2d_atlas.cpp b/src/mirage_render/src/texture/atlas/texture2d_atlas.cpp similarity index 100% rename from src/mirage_render/texture/atlas/texture2d_atlas.cpp rename to src/mirage_render/src/texture/atlas/texture2d_atlas.cpp diff --git a/src/mirage_render/texture/atlas/texture2d_atlas.h b/src/mirage_render/src/texture/atlas/texture2d_atlas.h similarity index 100% rename from src/mirage_render/texture/atlas/texture2d_atlas.h rename to src/mirage_render/src/texture/atlas/texture2d_atlas.h diff --git a/src/mirage_render/texture/atlas/texture_atlas_types.h b/src/mirage_render/src/texture/atlas/texture_atlas_types.h similarity index 100% rename from src/mirage_render/texture/atlas/texture_atlas_types.h rename to src/mirage_render/src/texture/atlas/texture_atlas_types.h diff --git a/src/mirage_render/texture/rw_texture2d.cpp b/src/mirage_render/src/texture/rw_texture2d.cpp similarity index 100% rename from src/mirage_render/texture/rw_texture2d.cpp rename to src/mirage_render/src/texture/rw_texture2d.cpp diff --git a/src/mirage_render/texture/rw_texture2d.h b/src/mirage_render/src/texture/rw_texture2d.h similarity index 100% rename from src/mirage_render/texture/rw_texture2d.h rename to src/mirage_render/src/texture/rw_texture2d.h diff --git a/src/mirage_render/texture/texture.cpp b/src/mirage_render/src/texture/texture.cpp similarity index 100% rename from src/mirage_render/texture/texture.cpp rename to src/mirage_render/src/texture/texture.cpp diff --git a/src/mirage_render/texture/texture.h b/src/mirage_render/src/texture/texture.h similarity index 100% rename from src/mirage_render/texture/texture.h rename to src/mirage_render/src/texture/texture.h diff --git a/src/mirage_render/texture/texture2d.cpp b/src/mirage_render/src/texture/texture2d.cpp similarity index 100% rename from src/mirage_render/texture/texture2d.cpp rename to src/mirage_render/src/texture/texture2d.cpp diff --git a/src/mirage_render/texture/texture2d.h b/src/mirage_render/src/texture/texture2d.h similarity index 100% rename from src/mirage_render/texture/texture2d.h rename to src/mirage_render/src/texture/texture2d.h diff --git a/src/mirage_render/texture/texture_map_types.h b/src/mirage_render/src/texture/texture_map_types.h similarity index 100% rename from src/mirage_render/texture/texture_map_types.h rename to src/mirage_render/src/texture/texture_map_types.h diff --git a/src/mirage_render/texture/texture_map_utils.h b/src/mirage_render/src/texture/texture_map_utils.h similarity index 100% rename from src/mirage_render/texture/texture_map_utils.h rename to src/mirage_render/src/texture/texture_map_utils.h diff --git a/src/mirage_render/texture/windows/rw_texture2d_d3d11.cpp b/src/mirage_render/src/texture/windows/rw_texture2d_d3d11.cpp similarity index 100% rename from src/mirage_render/texture/windows/rw_texture2d_d3d11.cpp rename to src/mirage_render/src/texture/windows/rw_texture2d_d3d11.cpp diff --git a/src/mirage_stb_image_loader/CMakeLists.txt b/src/mirage_render/stb_image_loader/CMakeLists.txt similarity index 68% rename from src/mirage_stb_image_loader/CMakeLists.txt rename to src/mirage_render/stb_image_loader/CMakeLists.txt index 7eef283..eb4d1c2 100644 --- a/src/mirage_stb_image_loader/CMakeLists.txt +++ b/src/mirage_render/stb_image_loader/CMakeLists.txt @@ -1,8 +1,8 @@ -project(mirage_stb_image_loader) +project(stb_image_loader) set(SRC_FILES) retrieve_files(${CMAKE_CURRENT_SOURCE_DIR} SRC_FILES) add_library(${PROJECT_NAME} STATIC ${SRC_FILES}) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(${PROJECT_NAME} PUBLIC mirage_image) +target_link_libraries(${PROJECT_NAME} PUBLIC mirage_render) diff --git a/src/mirage_stb_image_loader/stb_image.h b/src/mirage_render/stb_image_loader/stb_image.h similarity index 100% rename from src/mirage_stb_image_loader/stb_image.h rename to src/mirage_render/stb_image_loader/stb_image.h diff --git a/src/mirage_stb_image_loader/stb_image_loader.cpp b/src/mirage_render/stb_image_loader/stb_image_loader.cpp similarity index 72% rename from src/mirage_stb_image_loader/stb_image_loader.cpp rename to src/mirage_render/stb_image_loader/stb_image_loader.cpp index 069caac..ff48055 100644 --- a/src/mirage_stb_image_loader/stb_image_loader.cpp +++ b/src/mirage_render/stb_image_loader/stb_image_loader.cpp @@ -1,6 +1,7 @@ #include "stb_image_loader.h" #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" +#include "interface/image_interface.h" sg_pixel_format stb_image_info::get_pixel_format() const { // 根据通道数和是否HDR选择合适的像素格式 @@ -83,9 +84,29 @@ uint8_t* stb_image_loader::load_8_bit() const { return stbi_load_from_memory(data_, size_, &width, &height, &channels, 4); } -std::shared_ptr stb_image_loader::load() const { - auto heap = std::make_shared(); - heap->info = get_info(); +struct stb_heap_image { + stb_image_info info; + void* data; + + ~stb_heap_image() { + if (data) + stbi_image_free(data); + } +}; + +void delete_stb_image(image_heap_t* in_data) { + if (in_data->data) + stbi_image_free(in_data->data); + delete in_data; +} + +std::shared_ptr stb_image_loader::load() const { + std::shared_ptr heap(new image_heap_t, delete_stb_image); + const auto& info = get_info(); + heap->width = info.width; + heap->height = info.height; + heap->pixel_format = info.get_pixel_format(); + if (is_hdr()) heap->data = load_hdr(); else if (is_16_bit()) @@ -94,3 +115,9 @@ std::shared_ptr stb_image_loader::load() const { heap->data = load_8_bit(); return heap; } + +std::shared_ptr load_image(const std::span& in_raw_data) { + stb_image_loader loader; + loader.init(in_raw_data.data(), static_cast(in_raw_data.size())); + return loader.load(); +} diff --git a/src/mirage_stb_image_loader/stb_image_loader.h b/src/mirage_render/stb_image_loader/stb_image_loader.h similarity index 79% rename from src/mirage_stb_image_loader/stb_image_loader.h rename to src/mirage_render/stb_image_loader/stb_image_loader.h index dbd3c4f..2233d6b 100644 --- a/src/mirage_stb_image_loader/stb_image_loader.h +++ b/src/mirage_render/stb_image_loader/stb_image_loader.h @@ -5,6 +5,8 @@ #include "sokol_gfx.h" #include "stb_image.h" +struct image_heap_t; + struct stb_image_info { int32_t width; int32_t height; @@ -15,16 +17,6 @@ struct stb_image_info { [[nodiscard]] sg_pixel_format get_pixel_format() const; }; -struct stb_heap_image { - stb_image_info info; - void* data; - - ~stb_heap_image() { - if (data) - stbi_image_free(data); - } -}; - class stb_image_loader { public: void init(void* in_data, int32_t in_size); @@ -36,9 +28,8 @@ public: [[nodiscard]] float* load_hdr() const; [[nodiscard]] uint16_t* load_16_bit() const; [[nodiscard]] uint8_t* load_8_bit() const; - [[nodiscard]] std::shared_ptr load() const; + [[nodiscard]] std::shared_ptr load() const; private: - stbi_uc* data_{}; int32_t size_{}; }; diff --git a/src/mirage_widget/widget/leaf_widget/mtext_block.h b/src/mirage_widget/widget/leaf_widget/mtext_block.h index 94d18f2..036c2e8 100644 --- a/src/mirage_widget/widget/leaf_widget/mtext_block.h +++ b/src/mirage_widget/widget/leaf_widget/mtext_block.h @@ -43,7 +43,7 @@ private: std::u32string text_; text_layout_t layout_{}; - float font_size_ = 15.0f; + float font_size_ = 48.0f; float line_spacing_ = 1.2f; float max_width_ = 0.0f; std::shared_ptr font_; diff --git a/third_party/freetype b/third_party/freetype new file mode 160000 index 0000000..82090e6 --- /dev/null +++ b/third_party/freetype @@ -0,0 +1 @@ +Subproject commit 82090e67c24259c343c83fd9cefe6ff0be7a7eca diff --git a/third_party/harfbuzz b/third_party/harfbuzz new file mode 160000 index 0000000..9f83bbb --- /dev/null +++ b/third_party/harfbuzz @@ -0,0 +1 @@ +Subproject commit 9f83bbbe64654b45ba5bb06927ff36c2e7588495