From 525da85f51ace7c9d34e94c4907ea2ccc0666201 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Sun, 12 Oct 2025 18:24:59 +0300 Subject: [PATCH] Update skia version, and start work on getting harfbuzz shaper working --- CMakeLists.txt | 4 +- .../conan-skia/recipes/skia/all/conandata.yml | 22 +++++++++- .../conan-skia/recipes/skia/all/conanfile.py | 40 ++++++++++++++----- conan/conan-skia/recipes/skia/config.yml | 10 +++++ conan/conan_skia_command.sh | 5 --- conan/export_libs.bat | 2 +- conan/export_libs.sh | 2 +- conanfile.py | 27 ++++++++++--- src/CollabTextBox/CollabTextBoxShaper.cpp | 11 ++--- src/DrawComponents/DrawBrushStroke.cpp | 4 +- src/DrawingProgram/DrawingProgram.cpp | 2 +- src/FontData.cpp | 24 ++++++++++- 12 files changed, 117 insertions(+), 36 deletions(-) delete mode 100755 conan/conan_skia_command.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 0235c84..6909606 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -197,8 +197,8 @@ if(EMSCRIPTEN) target_link_options(infinipaint PRIVATE -O3) endif() - target_compile_options(infinipaint PRIVATE -Wall -fdiagnostics-color -sUSE_SDL=0 -include functional -fexceptions) - target_link_options(infinipaint PRIVATE --emrun -sUSE_SDL=0 -sFULL_ES2 -sUSE_WEBGL2=1 -sFETCH --embed-file data -sALLOW_MEMORY_GROWTH -sEXPORTED_RUNTIME_METHODS=ccall -sEXPORTED_FUNCTIONS=[_main,_malloc,_free] -sMAXIMUM_MEMORY=4GB -sSINGLE_FILE -lidbfs.js -fexceptions) + target_compile_options(infinipaint PRIVATE -Wall -sUSE_ICU=1 -sUSE_HARFBUZZ=1 -fdiagnostics-color -sUSE_SDL=0 -include functional -fexceptions) + target_link_options(infinipaint PRIVATE --emrun -sUSE_ICU=1 -sUSE_HARFBUZZ=1 -sUSE_SDL=0 -sFULL_ES2 -sUSE_WEBGL2=1 -sFETCH --embed-file data -sALLOW_MEMORY_GROWTH -sEXPORTED_RUNTIME_METHODS=ccall -sEXPORTED_FUNCTIONS=[_main,_malloc,_free] -sMAXIMUM_MEMORY=4GB -sSINGLE_FILE -lidbfs.js -fexceptions) if(EMSCRIPTEN_SINGLE_HTML_FILE) target_link_options(infinipaint PRIVATE --shell-file emscripteninstall/singlefilereleaseshell.html) set(CMAKE_EXECUTABLE_SUFFIX ".html") diff --git a/conan/conan-skia/recipes/skia/all/conandata.yml b/conan/conan-skia/recipes/skia/all/conandata.yml index 3ab79b3..83a7d37 100644 --- a/conan/conan-skia/recipes/skia/all/conandata.yml +++ b/conan/conan-skia/recipes/skia/all/conandata.yml @@ -34,4 +34,24 @@ sources: "134.20250327.0": url: - "https://github.com/google/skia/archive/aefbd9403c1b3032ad4cd0281ef312ed262c7125.zip" - sha256: "e10c67a96828b9f36364e2459cdee3e3b381a3875ff78db2b30e7b6fe69509bb" \ No newline at end of file + sha256: "e10c67a96828b9f36364e2459cdee3e3b381a3875ff78db2b30e7b6fe69509bb" + "135.20250607.0": + url: + - "https://github.com/google/skia/archive/f90131803d70d767bca2f86f12494d55662bdc60.zip" + sha256: "20a1bc403f4a7f6571e59da851e341d5674b644b8b6ae6b9758d3684d3044f62" + "136.20250607.0": + url: + - "https://github.com/google/skia/archive/bcce46ca33b67cc302dd53927a63013b8f53bf73.zip" + sha256: "f053d8c6fd8a1a9560b81f973ddddd2ffdba50e6a0318a4207a659acc5ebe156" + "137.20250607.0": + url: + - "https://github.com/google/skia/archive/0dfd95a49aed617f242c8b06dd5b255d1cb07776.zip" + sha256: "34869886d3ec540cb05c330b34a471126b24131aaff0aa69a1bf4f161d4211f3" + "138.20250708.0": + url: + - "https://github.com/google/skia/archive/a46d5732d9fca93eaec23e502e2eef814b707e6b.zip" + sha256: "ef11a5de527636d4278a38b110f290679bf4169653720ff68cb4e148027fec22" + "142.20250802.0": + url: + - "https://github.com/google/skia/archive/f4ed99d2443962782cf5f8b4dd27179f131e7cbe.zip" + sha256: "2e00dcdb54942c1da7b2f6cfd9fef8c4899115206d940931f6c040bac08b6b79" diff --git a/conan/conan-skia/recipes/skia/all/conanfile.py b/conan/conan-skia/recipes/skia/all/conanfile.py index 9f0544b..c4bb744 100644 --- a/conan/conan-skia/recipes/skia/all/conanfile.py +++ b/conan/conan-skia/recipes/skia/all/conanfile.py @@ -413,10 +413,10 @@ class ConanSkia(ConanFile): self.tool_requires("ninja/[>=1.11.0]") if self.options.use_harfbuzz and self.options.use_system_harfbuzz and self.options.use_conan_harfbuzz: - self.requires("harfbuzz/[>=7.3.0]", options = {"with_subset":True, "with_glib":False}) + self.requires("harfbuzz/10.4.0", options = {"with_subset":True, "with_glib":False}) if self.options.use_freetype and self.options.use_system_freetype and self.options.use_conan_freetype: - self.requires("freetype/[>=2.11.1]") + self.requires("freetype/2.13.2") if self.options.use_fontconfig and self.options.use_conan_fontconfig: self.requires("fontconfig/[>=2.14.2]") @@ -629,6 +629,27 @@ class ConanSkia(ConanFile): else: raise RuntimeError("Unexpected settings.arch") + if self.settings.os == "Emscripten": + args += f"skia_canvaskit_enable_alias_font = false\n" + args += f"skia_canvaskit_enable_bidi = false\n" + args += f"skia_canvaskit_enable_canvas_bindings = false\n" + args += f"skia_canvaskit_enable_debugger = false\n" + args += f"skia_canvaskit_enable_effects_deserialization = false\n" + args += f"skia_canvaskit_enable_embedded_font = false\n" + args += f"skia_canvaskit_enable_font = false\n" + args += f"skia_canvaskit_enable_matrix_helper = false\n" + args += f"skia_canvaskit_enable_paragraph = false\n" + args += f"skia_canvaskit_enable_pathops = false\n" + args += f"skia_canvaskit_enable_rt_shader = false\n" + args += f"skia_canvaskit_enable_skp_serialization = false\n" + args += f"skia_canvaskit_enable_sksl_trace = false\n" + args += f"skia_canvaskit_enable_webgl = false\n" + args += f"skia_canvaskit_enable_webgpu = false\n" + args += f"skia_canvaskit_force_tracing = false\n" + args += f"skia_canvaskit_include_viewer = false\n" + args += f"skia_canvaskit_legacy_draw_vertices_blend_mode = false\n" + args += f"skia_canvaskit_profile_build = false\n" + cflags = [] ldflags = [] asmflags = [] @@ -706,7 +727,7 @@ class ConanSkia(ConanFile): else: self.run("bin/gn gen out/conan") - self.run("ninja -C out/conan") + self.run("ninja -C out/conan skia svg skresources skcms skunicode skshaper skparagraph skottie bentleyottmann") def package(self): source_folder_include = join(self.source_folder, "include") @@ -751,9 +772,9 @@ class ConanSkia(ConanFile): else: copy(self, "*.a", build_folder_out, package_folder_lib, keep_path=False) - if self.settings.os == "Emscripten" and self.settings.arch == "wasm": - copy(self, "canvaskit.js", build_folder_out, package_folder_bin) - copy(self, "canvaskit.wasm", build_folder_out, package_folder_bin) + #if self.settings.os == "Emscripten" and self.settings.arch == "wasm": + # copy(self, "canvaskit.js", build_folder_out, package_folder_bin) + # copy(self, "canvaskit.wasm", build_folder_out, package_folder_bin) def package_info(self): @@ -897,9 +918,10 @@ class ConanSkia(ConanFile): self.cpp_info.system_libs += ["gdi32"] # component: pathkit + # not in program's build, so it'll be commented for now - if not self.options.shared: - self.cpp_info.libs += ["pathkit"] + #if not self.options.shared: + # self.cpp_info.libs += ["pathkit"] # component: skcms @@ -963,5 +985,3 @@ class ConanSkia(ConanFile): if self.options.enable_bentleyottmann: if not (self.settings.os == "Windows" and self.options.shared): self.cpp_info.libs += ["bentleyottmann"] - - diff --git a/conan/conan-skia/recipes/skia/config.yml b/conan/conan-skia/recipes/skia/config.yml index 330e609..ddc7bec 100644 --- a/conan/conan-skia/recipes/skia/config.yml +++ b/conan/conan-skia/recipes/skia/config.yml @@ -17,3 +17,13 @@ versions: folder: all "134.20250327.0": folder: all + "135.20250607.0": + folder: all + "136.20250607.0": + folder: all + "137.20250607.0": + folder: all + "138.20250708.0": + folder: all + "142.20250802.0": + folder: all diff --git a/conan/conan_skia_command.sh b/conan/conan_skia_command.sh deleted file mode 100755 index bd945c7..0000000 --- a/conan/conan_skia_command.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -cd conan-skia/recipes/skia/all -conan create . -o use_system_expat=False -o use_system_freetype=False -o use_system_harfbuzz=False -o use_system_icu=False -o use_system_libjpeg_turbo=False -o use_system_libpng=False -o use_system_libwebp=False -o use_system_zlib=False --build=missing --version=134.20250327.0 -cd ../../../.. diff --git a/conan/export_libs.bat b/conan/export_libs.bat index 95a18d3..3b527c2 100755 --- a/conan/export_libs.bat +++ b/conan/export_libs.bat @@ -1,4 +1,4 @@ conan export %0/../libjuice/all/conanfile.py --version=1.6.1 conan export %0/../libdatachannel/all/conanfile.py --version=0.23.1 -conan export %0/../conan-skia/recipes/skia/all/conanfile.py --version=134.20250327.0 +conan export %0/../conan-skia/recipes/skia/all/conanfile.py --version=142.20250802.0 conan export %0/../sdl3/3.x/conanfile.py --version=3.2.24 diff --git a/conan/export_libs.sh b/conan/export_libs.sh index 646ecea..08fe1ca 100755 --- a/conan/export_libs.sh +++ b/conan/export_libs.sh @@ -5,7 +5,7 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) conan export "$(dirname "$0")/libjuice/all/conanfile.py" --version=1.6.1 conan export "$(dirname "$0")/libdatachannel/all/conanfile.py" --version=0.23.1 conan export "$(dirname "$0")/mpg123/all/conanfile.py" --version=1.32.10 -conan export "$(dirname "$0")/conan-skia/recipes/skia/all/conanfile.py" --version=134.20250327.0 +conan export "$(dirname "$0")/conan-skia/recipes/skia/all/conanfile.py" --version=142.20250802.0 conan export "$(dirname "$0")/sdl3/3.x/conanfile.py" --version=3.2.24 #conan create . -o use_system_expat=False -o use_system_freetype=False -o use_system_harfbuzz=False -o use_system_icu=False -o use_system_libjpeg_turbo=False -o use_system_libpng=False -o use_system_libwebp=False -o use_system_zlib=False --build=missing --version=134.20250327.0 #cd ../../../.. diff --git a/conanfile.py b/conanfile.py index 0e33acd..2ee47d8 100644 --- a/conanfile.py +++ b/conanfile.py @@ -7,18 +7,33 @@ class CompressorRecipe(ConanFile): def requirements(self): if self.settings.os == "Emscripten": - self.requires("skia/134.20250327.0", options = { + self.requires("skia/142.20250802.0", options = { "enable_svg": True, + "use_freetype":True, + "use_system_freetype":True, "use_expat": True, "use_harfbuzz": True, - "use_system_harfbuzz":False, - "use_conan_harfbuzz":True, - "enable_skshaper": True + "use_system_harfbuzz":True, + "use_conan_harfbuzz":False, + "enable_skshaper": True, + "canvaskit_enable_alias_font" : False, + "canvaskit_enable_canvas_bindings" : False, + "canvaskit_enable_effects_deserialization" : False, + "canvaskit_enable_embedded_font" : False, + "canvaskit_enable_font" : False, + "canvaskit_enable_matrix_helper" : False, + "canvaskit_enable_pathops" : False, + "canvaskit_enable_rt_shader" : False, + "canvaskit_enable_skp_serialization" : False, + "canvaskit_enable_sksl_trace" : False, + "canvaskit_enable_webgpu " : False, + "canvaskit_enable_webgl " : False }) else: - self.requires("skia/134.20250327.0", options = { + self.requires("skia/142.20250802.0", options = { "use_system_expat":False, - "use_system_freetype":False, + "use_system_freetype":True, + "use_conan_freetype":True, "use_system_harfbuzz":False, "use_system_icu":False, "use_system_libjpeg_turbo":False, diff --git a/src/CollabTextBox/CollabTextBoxShaper.cpp b/src/CollabTextBox/CollabTextBoxShaper.cpp index 8680616..f897f62 100644 --- a/src/CollabTextBox/CollabTextBoxShaper.cpp +++ b/src/CollabTextBox/CollabTextBoxShaper.cpp @@ -209,7 +209,7 @@ static void set_character_bounds(void* context, SkFontMetrics metrics; font.getMetrics(&metrics); std::unique_ptr advances(new float[glyphCount]); - font.getWidths(glyphs, glyphCount, advances.get()); + font.getWidths({glyphs, glyphCount}, {advances.get(), glyphCount}); // Loop over each cluster in this run. size_t clusterStart = 0; @@ -284,10 +284,11 @@ CollabTextBox::ShapeResult CollabTextBox::shape(const char* utf8Text, std::unique_ptr shaper = nullptr; auto unicode = get_unicode_2(); - // USING PRIMITIVE WRAPPER INSTEAD OF HARFBUZZ, BECAUSE HARFBUZZ HAS ISSUES ON EMSCRIPTEN - // WE MIGHT HAVE TO CHANGE THIS BACK LATER WHEN THERE'S A FIX - //shaper = SkShapers::HB::ShaperDrivenWrapper(unicode, fontMgr); - shaper = SkShaper::MakePrimitive(); +//#ifdef __EMSCRIPTEN__ + //shaper = SkShaper::MakePrimitive(); +//#else + shaper = SkShapers::HB::ShaperDrivenWrapper(unicode, fontMgr); +//#endif SkASSERT(shaper); diff --git a/src/DrawComponents/DrawBrushStroke.cpp b/src/DrawComponents/DrawBrushStroke.cpp index 76b6d66..c44251d 100644 --- a/src/DrawComponents/DrawBrushStroke.cpp +++ b/src/DrawComponents/DrawBrushStroke.cpp @@ -232,7 +232,7 @@ void DrawBrushStroke::create_triangles(const std::functionaddPoly(topPoints.data(), topPoints.size(), false); + bPath->addPoly({topPoints.data(), topPoints.size()}, false); return; } @@ -381,7 +381,7 @@ void DrawBrushStroke::create_triangles(const std::functionaddPoly(topPoints.data(), topPoints.size(), false); + bPath->addPoly({topPoints.data(), topPoints.size()}, false); } } diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index 6d5df61..a4fc71b 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -408,7 +408,7 @@ bool DrawingProgram::prevent_undo_or_redo() { SkPaint DrawingProgram::select_tool_line_paint() { SkScalar intervals[] = {10, 5}; float timeSinceEpoch = std::chrono::duration_cast>(std::chrono::steady_clock::now().time_since_epoch()).count(); - sk_sp lassoLineDashEffect = SkDashPathEffect::Make(intervals, 2, -std::fmod(timeSinceEpoch * 50, 15)); + sk_sp lassoLineDashEffect = SkDashPathEffect::Make({intervals, 2}, -std::fmod(timeSinceEpoch * 50, 15)); SkPaint selectLinePaint; selectLinePaint.setStyle(SkPaint::kStroke_Style); diff --git a/src/FontData.cpp b/src/FontData.cpp index f1e5d0b..788e05b 100644 --- a/src/FontData.cpp +++ b/src/FontData.cpp @@ -5,9 +5,29 @@ #include #include -FontData::FontData(): - mgr(SkFontMgr_New_Custom_Empty()) +#ifdef __EMSCRIPTEN__ +#elif _WIN32 + #include +#elif __APPLE__ + #include +#elif __linux__ + #include + #include +#endif + +FontData::FontData() { +#ifdef __EMSCRIPTEN__ + mgr = SkFontMgr_New_Custom_Empty(); +#elif _WIN32 + mgr = SkFontMgr_New_GDI(); +#elif __APPLE__ + mgr = SkFontMgr_New_Custom_Empty(); +#elif __linux__ + mgr = SkFontMgr_New_FontConfig(nullptr, SkFontScanner_Make_FreeType()); +#else + mgr = SkFontMgr_New_Custom_Empty(); +#endif map["Roboto"] = mgr->makeFromFile("data/fonts/Roboto-variable.ttf"); }