
图形学图像处理【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images.项目地址https://gitcode.com/gh_mirrors/skia1/skia点击查看免费下载本文以 Skia 仓库中modules/pathkit/README.md的核心内容为骨架完整覆盖 PathKit 从源码编译GN 与 Bazel 双路径、本地示例运行、自动化测试到 npm 发布的全流程操作并结合 Makefile、compile.sh 和 pathkit_wasm_bindings.cpp 等仓库源码深入解析每条命令背后的构建参数、Emscripten 链接选项与 JS/C 绑定机制。读完本文你可以独立完成 PathKit WASM 库的生产构建与测试理解其模块化的导出方式PathKitInit并能基于源码定位各构建目标的差异。一、PathKit 是什么Skia PathOps 的浏览器化PathKit 是 Skia 官方模块位于modules/pathkit/其目标是让开发者在浏览器中使用 Skia 功能丰富的 PathOps API。它把 Skia 的路径几何核心——包括SkPath的路径构建、PathOps 布尔运算union/intersect/difference/xor 等、PathEffect虚线、修剪、描边转填充、SVG 字符串互转以及 Path2D/Canvas 互操作——编译成一份可被 Web 直接加载的 WebAssembly 产物。从 pathkit_wasm_bindings.cpp 的EMSCRIPTEN_BINDINGS(skia)段#L487 起可以看到完整暴露给 JS 的 API 面SkPath类绑定为 JS 可实例化对象提供_moveTo/_lineTo/_quadTo/_conicTo/_cubicTo/_close等路径构建方法JS 侧再包装为可链式调用的moveTo等setFillType/getBounds/computeTightBounds等几何查询以及_simplify/_asWinding/_op三个 PathOps 方法全局函数NewPath、FromSVGString、FromCmds、MakeFromOp等枚举PathOpDIFFERENCE / INTERSECT / UNION / XOR / REVERSE_DIFFERENCE、FillTypeWINDING / EVENODD / INVERSE_WINDING / INVERSE_EVENODD、StrokeJoin、StrokeCap值对象SkRect、StrokeOpts、以及以 9 元素数组形式传入的SkMatrixvalue_array绑定客户端可以直接写path.transform([0,1,2,3,4,5,6,7,8])。PathKit 最终产物分两部分一份 JS loader和实际的 WASM/asm.js 代码。JS loader 会在浏览器中创建一个全局函数PathKitInit调用它后返回一个 Promiseresolve 出的PathKit对象即为完全加载、可直接使用的库入口。二、使用方式加载 PathKitInit对应 npm 包的 README仓库中 npm-wasm/README.md 与 npm-asmjs/README.md 给出了两个 npm 分发包pathkit-wasm与pathkit-asmjs的用法两者结构一致script src/node_modules/pathkit-wasm/bin/pathkit.js/script PathKitInit({ locateFile: (file) /node_modules/pathkit-wasm/bin/file, }).then((PathKit) { // Code goes here using PathKit });要点locateFile回调用于告诉 JS loader.wasm文件asm.js 版本则是pathkit.js.mem的实际位置。默认情况下 loader 会在/pathkit.wasm查找若文件不在该位置必须通过locateFile指定PathKitInitPromise resolve 之后拿到的PathKit对象即可直接使用无需额外初始化步骤。配合 WebPack 时的注意事项来自 npm-wasm 包 README使用require(pathkit-wasm/bin/pathkit.js)引入 loader由于 WebPack 只打包所需片段而不暴露整个node_modules/目录需要用 CopyWebpackPlugin 把pathkit.wasm复制到构建输出目录若遇到Cant resolve fs报错在 WebPack 配置的node段中加入fs: empty即可。CHANGELOG.md 中还记录了一条重要的 API 演进自 0.7.0 版本起PathKitInit(...)直接返回 Promise旧式的PathKitInit(...).ready()调用形式已被移除。三、GN 路径编译compile.sh 与 emsdk 环境README「Compiling the source → Compiling with GN」一节说明的标准流程如下准备一套编译好的 Emscripten SDK 并放入 PATH。官方推荐的最便捷方式是运行//tools/git-sync-deps它会下载并执行 activate-emsdk 脚本在modules/pathkit/目录下执行./compile.sh即产出生产级 WASM 构建输出目录为//out/pathkit。加--help可查看其他选项。--help背后是 compile.sh 中定义的一组可选参数#L34-L46参数作用默认无参数生产 WASM 构建test产出适合跑测试/性能分析的构建-O2 --profiling -DPATHKIT_TESTING -DSK_RELEASEdebug调试构建定义SK_DEBUG-O0 --js-opts 0 -sSAFE_HEAP1 -sASSERTIONS1 -g3asm.js构建 asm.js 而非 WASM官方注明very experimental链接参数变为-sWASM0 -sALLOW_MEMORY_GROWTH1serve启动一个 web server可访问localhost:8000/pathkit.html演示页compile.sh的前置条件#L17-L32值得注意环境变量EMSDK必须已设置并指向 emsdk 安装目录否则脚本报错退出脚本会pushd到 SKIA_HOME本目录上两级再工作并要求能在工作区根目录找到./src目录以此校验源码检出是否完好构建前先清理out/pathkit/*.a注释解释原因是有时 .a 文件会残留旧符号清理可确保获得全新构建。其构建分两步用 GN 生成 Ninja 文件并编译静态库#L77-L97bin/fetch-gn拉取 GN然后gn gen out/pathkit关键 GN 参数为skia_emsdk_dir${EMSDK}、is_trivial_abitrue、target_cpuwasm并通过extra_cflags注入-sMAIN_MODULE1和-DSK_RELEASE随后执行ninja -C out/pathkit libpathkit.a。脚本中有一段明确警示#L53-L55-DSK_RELEASE/-DSK_DEBUG必须与libskia.a所用宏严格一致否则会出现SKDEBUGCODE时而编译进时而没有、sizeof()在 .cpp 与 .h 之间不一致之类的疑难问题用 em 链接生成最终产物#L101-L121核心链接参数包括${EMCXX} $RELEASE_CONF -stdc17 -I. \ --bind \ # 使用 Embind 绑定连接 C 与 JS --no-entry \ --pre-js $BASE_DIR/helper.js \ --pre-js $BASE_DIR/chaining.js \ -fno-rtti -fno-exceptions \ -sWASM1 \ -sERROR_ON_UNDEFINED_SYMBOLS1 \ -sEXPORT_NAMEPathKitInit \ # 全局入口函数名 -sMODULARIZE1 \ # 模块化导出 -sNO_EXIT_RUNTIME1 \ -sNO_FILESYSTEM1 \ -sDYNAMIC_EXECUTION0 \ -sINITIAL_MEMORY32MB \ -sALLOW_MEMORY_GROWTH1 \ -sSTRICT1 \ -o $BUILD_DIR/pathkit.js \ $BASE_DIR/pathkit_wasm_bindings.cpp \ ${BUILD_DIR}/libpathkit.a其中-sEXPORT_NAMEPathKitInit正是前文加载代码中全局函数的来源--pre-js注入的 chaining.js 与 helper.js 是 JS 侧的胶水层。从 helper.js 源码可以看到PathKit.loadCmdsTypedArray把二维 cmds 数组拍平为 Float32Array 并_malloc到 WASM 堆上供 C 端FromCmds(uintptr_t cptr, int numCmds)以指针读取注释解释了为何绑定层用uintptr_t模拟浮点指针——EMSCRIPTEN_BINDINGS 无法接受原始指针参数PathKit.cubicYFromX/cubicPtFromT通过缓存上一次的SkCubicMap实例加速求解注释注明此缓存策略带来约 10-15 倍提速并在参数变化时delete()旧对象以避免内存泄漏。四、Bazel 路径编译README「Compiling with Bazel」一节给出的命令如下在modules/pathkit/目录下执行# 生产构建输出到 //bazel-bin/modules/pathkit/pathkit bazelisk build //modules/pathkit:pathkit --configck_full_webgl2_release # 调试构建 bazelisk build //modules/pathkit:pathkit --configck_full_webgl2_debug对应目标定义在 BUILD.bazel。其结构与 GN 路径高度对应可逐项印证pathkit.buildcc_binarysrcs [pathkit_wasm_bindings.cpp]deps [//:skia_public]即把 Skia 公共库与绑定文件一起编译CK_DEFINES中定义CK_INCLUDE_PATHOPS这是把 PathOps 子模块包含进 Skia 构建的开关CK_LINKOPTS与 compile.sh 的链接参数一一对应--bindEmbind、-sWASM、-sMODULARIZE、-sALLOW_MEMORY_GROWTH、-sEXPORT_NAMEPathKitInit、-sINITIAL_MEMORY32MB以及同样通过--pre-js注入chaining.js与helper.jsrelease 选择RELEASE_OPTS-Oz、--closure 1、-DSK_RELEASEclosure 的 externs 文件即 externs.jsdebug 则选择DEBUG_OPTS-O0、-sSAFE_HEAP1、-sASSERTIONS1、-g3、-DSK_DEBUG、-DPATHKIT_TESTING与 compile.sh 的三档配置语义一致。五、本地运行示例页README「Testing → Running example page locally」给出的最小验证闭环# 先构建 PathKitGN 路径 make release # 再启动本地测试服务器 make local-example然后按终端提示在浏览器中打开示例页。对照 Makefilerelease目标#L18-L28先执行./compile.shWASM 构建与./compile.sh asm.jsasm.js 构建把产物分别复制到build/wasm/pathkit.jspathkit.wasm和build/asmjs/pathkit.jspathkit.js.memlocal-example目标#L77-L80打印http://localhost:8000/npm-wasm/example.html与http://localhost:8000/npm-asmjs/example.html两个地址实际执行的是仓库根目录的 serve_wasm.py 静态服务器。示例页本身是 npm-wasm/example.html它通过PathKitInit({ locateFile: (file) /build/wasm/file })加载库并演示了库的主要能力分组多目标输出同一条路径可输出为 SVG Path、Canvas 2D 或 Path2D 对象对应绑定层toSVGString/toCanvas/toPath2D见 pathkit_wasm_bindings.cpp #L270-L311其中ToCanvas会用SkPath::ConvertConicToQuads以 2 段二次贝塞尔近似 conic 曲线因为 Canvas 2D 没有原生 conic 指令类 Path2D 的可链式 APIPathKit.NewPath().moveTo(1,1).lineTo(20,1)...closePath()Path Effectsdash/trim/stroke 等nonzero / evenodd 两种填充规则三次曲线求解给定 X 反解 Y对应SkCubicMap绑定。六、自动化测试Karma JasmineREADME 给出了两条测试流程分别验证 GN 构建与 Bazel 构建产物测试 GN 构建make release make npm npm ci make test-continuous测试 Bazel 构建make debug-bazel make npm-bazel npm ci make test-continuous各步骤含义对照 Makefilemake npm先rm -rf并重建npm-wasm/bin、npm-asmjs/bin然后编译 WASM 与 asm.js 两套生产产物、连同 CHANGELOG.md 一起放入对应目录#L39-L50make npm-bazel则改用bazelisk build //modules/pathkit:pathkit --configck_full_webgl2_release#L52-L63npm ci安装 package.json 中的 devDependencieskarma ~6.3.16、karma-jasmine、karma-chrome-launcher 等make test-continuous实际执行npx karma start ./karma.conf.js --no-single-run --watch-poll#L65-L69即持续监听模式。测试配置 karma.conf.js 的关键细节默认加载build/wasm/pathkit.wasm与build/wasm/pathkit.js并把/pathkit/代理到/base/build/wasm/设置环境变量ASM_JS1对应 Makefile 的test-continuous-asmjs目标则切换为加载build/asmjs/下产物测试用例位于tests/目录path.spec.js、pathops.spec.js、path2d.spec.js、svg.spec.js、effects.spec.js、util.spec.js另有两个 JSON 数据驱动文件PathOpsOp.json/PathOpsSimplify.json用于 PathOps 用例配置中通过is-docker检测是否运行在容器内若是则自动改用ChromeHeadlessNoSandbox启动器并附带--no-sandbox、--browser-test、--disable-dev-shm-usage等 flag 以避免容器环境下的命名空间与 /dev/shm 问题性能测试脚本位于perf/pathops.bench.js、path.bench.js、effects.bench.js配套 karma.bench.conf.js 使用对应 compile.sh 中test档位的--profiling构建。七、发布到 npmREADME「Deploying to npm」明确注明发布流程使用 GN 构建。步骤为# 构建 release 版本的 asmjs 与 WASM 两套产物 # 二进制会被放到 npm-*/bin 的相应位置 make npm # 然后在每个 npm- 子目录中执行 npm version minor (或 patch 或 major) npm login --registry https://wombat-dressing-room.appspot.com npm publish两个发布包的元信息可对照仓库npm-wasm/package.json包名pathkit-wasmmain指向bin/pathkit.jspublishConfig.registry固定为 wombat-dressing-room 仓库Google 内部 npm 代理许可证 BSD-3-Clausenpm-asmjs/package.json 同理包名为pathkit-asmjs。make npm与make npm-bazel的产物布局一致WASM 版放入npm-wasm/binpathkit.jspathkit.wasmasm.js 版放入npm-asmjs/binpathkit.jspathkit.js.mem并同步复制 CHANGELOG.md 到两个包目录。这解释了为什么两个包的 README 中locateFile分别指向.wasm与.js.mem文件。八、小结关键路径速查目标命令产物位置源码依据GN 生产 WASM 构建./compile.shout/pathkit/pathkit.js(.wasm)compile.shBazel 生产 WASM 构建bazelisk build //modules/pathkit:pathkit --configck_full_webgl2_releasebazel-bin/modules/pathkit/pathkit/BUILD.bazel本地示例make release make local-examplehttp://localhost:8000/npm-wasm/example.htmlMakefile自动化测试make npm npm ci make test-continuousKarma Jasminetests/*.spec.jskarma.conf.js发布make npm后在各 npm- 目录npm publishnpm-wasm / npm-asmjs 包npm-wasm/package.json需要强调的前提与限制GN 路径依赖 Emscripten SDK 且要求EMSDK环境变量已设置推荐通过tools/git-sync-deps一键配置Bazel 路径通过bazelisk执行asm.js构建在脚本注释中被标注为very experimental而 npm 发布流程目前只支持 GN 构建。理解这些差异后读者即可在当前仓库中完整复现 PathKit 从 C 源码到浏览器 WASM 库的整条链路。赞分享图形学图像处理【免费下载链接】skiaSkia is a complete 2D graphic library for drawing Text, Geometries, and Images.项目地址https://gitcode.com/gh_mirrors/skia1/skia点击查看免费下载相关推荐CanvasKit-wasm 集成指南在浏览器、Node.js 与 Webpack 中使用 Skia 的 WASM Canvas APICanvasKit wasm 集成指南在浏览器、Node.js 与 Webpack 中使用 Skia 的 WASM Canvas API CanvasKit图形学Skia wasm-common Docker用四张 Docker 镜像构建与测试 PathKit/CanvasKit WASM 的完整指南Skia wasm common Docker用四张 Docker 镜像构建与测试 PathKit/CanvasKit WASM 的完整指南 本文基于 Ski图形学图像处理Skia PathKit 版本演进解析从 CHANGELOG 看懂 WASM PathOps 的构建、API 与内存变化Skia PathKit 版本演进解析从 CHANGELOG 看懂 WASM PathOps 的构建、API 与内存变化 PathKit 是 Skia 官方提图形学图像处理上一篇如何在5分钟内安装Protenix完整新手入门指南下一篇5分钟上手ThinkGPT构建你的第一个AI思维链应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考