diff --git a/.cargo/config.toml b/.cargo/config.toml index 7d318fa4..04c53e22 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,5 +1,5 @@ [target.x86_64-pc-windows-msvc] -rustflags = ["-C", "link-args=/NODEFAULTLIB:libcmt.lib"] +rustflags = ["-C", "link-args=/NODEFAULTLIB:libcmt.lib", "-C", "target-feature=+crt-static"] [target.aarch64-apple-darwin] rustflags = ["-C", "target-cpu=apple-a14"] diff --git a/.github/workflows/CI.yaml b/.github/workflows/CI.yaml index 46ce8740..32bbbba3 100644 --- a/.github/workflows/CI.yaml +++ b/.github/workflows/CI.yaml @@ -146,7 +146,12 @@ jobs: - uses: goto-bus-stop/setup-zig@v2 if: ${{ matrix.settings.target == 'armv7-unknown-linux-gnueabihf' }} with: - version: 0.10.1 + version: 0.11.0 + + - name: Set env + if: matrix.settings.host == 'windows-latest' + run: ls -la "C:\Program Files\LLVM" + shell: bash - name: Set env if: matrix.settings.host == 'windows-latest' diff --git a/.github/workflows/skia.yaml b/.github/workflows/skia.yaml index c5b10252..f45cc779 100644 --- a/.github/workflows/skia.yaml +++ b/.github/workflows/skia.yaml @@ -46,6 +46,7 @@ jobs: if: matrix.os == 'windows-latest' run: | choco install llvm ninja -y + choco upgrade llvm pip install certifi - name: Login to GitHub Container Registry diff --git a/CHANGELOG.md b/CHANGELOG.md index 96b74239..7a4ba5c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,31 +1,22 @@ ## [0.1.44](https://github.com/Brooooooklyn/canvas/compare/v0.1.43...v0.1.44) (2023-08-22) - ### Bug Fixes -* file extensions in `loadFontsFromDir()` are no longer case-sensitive ([9342e33](https://github.com/Brooooooklyn/canvas/commit/9342e3386f575f3864c1bfa0036caa0956f1a914)) - - +- file extensions in `loadFontsFromDir()` are no longer case-sensitive ([9342e33](https://github.com/Brooooooklyn/canvas/commit/9342e3386f575f3864c1bfa0036caa0956f1a914)) ## [0.1.43](https://github.com/Brooooooklyn/canvas/compare/v0.1.42...v0.1.43) (2023-08-11) - - ## [0.1.42](https://github.com/Brooooooklyn/canvas/compare/v0.1.41...v0.1.42) (2023-08-08) - ### Bug Fixes -* add `ctx.canvas` property on svg context ([#697](https://github.com/Brooooooklyn/canvas/issues/697)) ([968e501](https://github.com/Brooooooklyn/canvas/commit/968e501e5d09d5b11fb02829b6ba402ffc3575d1)) -* **deps:** update rust crate infer to 0.15 ([376b19e](https://github.com/Brooooooklyn/canvas/commit/376b19ebc53640a89e1dad73b8281922675cf834)) -* url is string type ([#671](https://github.com/Brooooooklyn/canvas/issues/671)) ([31a8ff9](https://github.com/Brooooooklyn/canvas/commit/31a8ff9a5295697b965ba4e48a19a30dc0f0b1d6)) - +- add `ctx.canvas` property on svg context ([#697](https://github.com/Brooooooklyn/canvas/issues/697)) ([968e501](https://github.com/Brooooooklyn/canvas/commit/968e501e5d09d5b11fb02829b6ba402ffc3575d1)) +- **deps:** update rust crate infer to 0.15 ([376b19e](https://github.com/Brooooooklyn/canvas/commit/376b19ebc53640a89e1dad73b8281922675cf834)) +- url is string type ([#671](https://github.com/Brooooooklyn/canvas/issues/671)) ([31a8ff9](https://github.com/Brooooooklyn/canvas/commit/31a8ff9a5295697b965ba4e48a19a30dc0f0b1d6)) ### Features -* upgrade skia to m116 ([#702](https://github.com/Brooooooklyn/canvas/issues/702)) ([926c472](https://github.com/Brooooooklyn/canvas/commit/926c47249b77894eb96fd002755ad73e50e602d6)) - - +- upgrade skia to m116 ([#702](https://github.com/Brooooooklyn/canvas/issues/702)) ([926c472](https://github.com/Brooooooklyn/canvas/commit/926c47249b77894eb96fd002755ad73e50e602d6)) ## [0.1.41](https://github.com/Brooooooklyn/canvas/compare/v0.1.40...v0.1.41) (2023-05-22) diff --git a/README-zh.md b/README-zh.md index f2453326..f422a334 100644 --- a/README-zh.md +++ b/README-zh.md @@ -1,7 +1,7 @@ # `skr canvas` ![CI](https://github.com/Brooooooklyn/canvas/workflows/CI/badge.svg) -![Skia Version](https://img.shields.io/badge/Skia-chrome%2Fm116-hotpink) +![Skia Version](https://img.shields.io/badge/Skia-chrome%2Fm118-hotpink) [![install size](https://packagephobia.com/badge?p=@napi-rs/canvas)](https://packagephobia.com/result?p=@napi-rs/canvas) [![Downloads](https://img.shields.io/npm/dm/@napi-rs/canvas.svg?sanitize=true)](https://npmcharts.com/compare/@napi-rs/canvas?minimal=true) diff --git a/README.md b/README.md index c36cbf71..1de5b9a3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # `skr canvas` ![CI](https://github.com/Brooooooklyn/canvas/workflows/CI/badge.svg) -![Skia Version](https://img.shields.io/badge/Skia-chrome%2Fm116-hotpink) +![Skia Version](https://img.shields.io/badge/Skia-chrome%2Fm118-hotpink) [![install size](https://packagephobia.com/badge?p=@napi-rs/canvas)](https://packagephobia.com/result?p=@napi-rs/canvas) [![Downloads](https://img.shields.io/npm/dm/@napi-rs/canvas.svg?sanitize=true)](https://npmcharts.com/compare/@napi-rs/canvas?minimal=true) diff --git a/npm/android-arm64/package.json b/npm/android-arm64/package.json index 186f7ab5..7f71d200 100644 --- a/npm/android-arm64/package.json +++ b/npm/android-arm64/package.json @@ -34,4 +34,4 @@ "access": "public" }, "repository": "https://github.com/Brooooooklyn/canvas.git" -} \ No newline at end of file +} diff --git a/npm/darwin-arm64/package.json b/npm/darwin-arm64/package.json index 549b14fd..17718302 100644 --- a/npm/darwin-arm64/package.json +++ b/npm/darwin-arm64/package.json @@ -34,4 +34,4 @@ "access": "public" }, "repository": "https://github.com/Brooooooklyn/canvas.git" -} \ No newline at end of file +} diff --git a/npm/darwin-x64/package.json b/npm/darwin-x64/package.json index 07b3666f..e547584d 100644 --- a/npm/darwin-x64/package.json +++ b/npm/darwin-x64/package.json @@ -34,4 +34,4 @@ "access": "public" }, "repository": "https://github.com/Brooooooklyn/canvas.git" -} \ No newline at end of file +} diff --git a/npm/linux-arm-gnueabihf/package.json b/npm/linux-arm-gnueabihf/package.json index 50a335cc..7bbb31ea 100644 --- a/npm/linux-arm-gnueabihf/package.json +++ b/npm/linux-arm-gnueabihf/package.json @@ -34,4 +34,4 @@ "access": "public" }, "repository": "https://github.com/Brooooooklyn/canvas.git" -} \ No newline at end of file +} diff --git a/npm/linux-arm64-gnu/package.json b/npm/linux-arm64-gnu/package.json index b1a969b7..ba1082d6 100644 --- a/npm/linux-arm64-gnu/package.json +++ b/npm/linux-arm64-gnu/package.json @@ -41,4 +41,4 @@ "access": "public" }, "repository": "https://github.com/Brooooooklyn/canvas.git" -} \ No newline at end of file +} diff --git a/npm/linux-arm64-musl/package.json b/npm/linux-arm64-musl/package.json index 0446f643..3a0403b0 100644 --- a/npm/linux-arm64-musl/package.json +++ b/npm/linux-arm64-musl/package.json @@ -41,4 +41,4 @@ "access": "public" }, "repository": "https://github.com/Brooooooklyn/canvas.git" -} \ No newline at end of file +} diff --git a/npm/linux-x64-gnu/package.json b/npm/linux-x64-gnu/package.json index 23d1028c..1672d8d6 100644 --- a/npm/linux-x64-gnu/package.json +++ b/npm/linux-x64-gnu/package.json @@ -41,4 +41,4 @@ "access": "public" }, "repository": "https://github.com/Brooooooklyn/canvas.git" -} \ No newline at end of file +} diff --git a/npm/linux-x64-musl/package.json b/npm/linux-x64-musl/package.json index 5e075940..edcd3b5b 100644 --- a/npm/linux-x64-musl/package.json +++ b/npm/linux-x64-musl/package.json @@ -41,4 +41,4 @@ "access": "public" }, "repository": "https://github.com/Brooooooklyn/canvas.git" -} \ No newline at end of file +} diff --git a/npm/win32-x64-msvc/package.json b/npm/win32-x64-msvc/package.json index 60564676..aced4c9d 100644 --- a/npm/win32-x64-msvc/package.json +++ b/npm/win32-x64-msvc/package.json @@ -35,4 +35,4 @@ "access": "public" }, "repository": "https://github.com/Brooooooklyn/canvas.git" -} \ No newline at end of file +} diff --git a/scripts/build-skia.js b/scripts/build-skia.js index b9ba1367..afa480f2 100644 --- a/scripts/build-skia.js +++ b/scripts/build-skia.js @@ -1,7 +1,9 @@ -const { execSync } = require('child_process') -const { readFileSync, writeFileSync } = require('fs') -const path = require('path') -const { platform, arch } = require('os') +const { execSync } = require('node:child_process') +const { readFileSync, writeFileSync, existsSync } = require('node:fs') +const path = require('node:path') +const { sep } = require('node:path/win32') +const { sep: unixSep } = require('node:path/posix') +const { platform, arch } = require('node:os') const PLATFORM_NAME = platform() const HOST_ARCH = arch() @@ -101,7 +103,10 @@ switch (PLATFORM_NAME) { '\\"-DSK_CODEC_DECODES_JPEG\\",' + '\\"-DSK_HAS_HEIF_LIBRARY\\",' + '\\"-DSK_SHAPER_HARFBUZZ_AVAILABLE\\"' - ExtraSkiaBuildFlag = 'clang_win=\\"C:\\\\Program Files\\\\LLVM\\"' + const llvmHome = findLLVMHomeOnWindows()?.replaceAll(sep, unixSep) + if (llvmHome) { + ExtraSkiaBuildFlag = `clang_win=\\"${llvmHome}"` + } GN_ARGS.push(`skia_enable_fontmgr_win=false`) GN_ARGS.push(`skia_fontmgr_factory=\\":fontmgr_custom_directory_factory\\"`) break @@ -161,8 +166,7 @@ switch (TARGET_TRIPLE) { ExtraCflags = `"--target=aarch64-unknown-linux-musl", "-B/aarch64-linux-musl-cross/aarch64-linux-musl/bin", "-I/aarch64-linux-musl-cross/aarch64-linux-musl/include", "-I/aarch64-linux-musl-cross/aarch64-linux-musl/include/c++/${gccVersion}", "-I/aarch64-linux-musl-cross/aarch64-linux-musl/include/c++/${gccVersion}/aarch64-linux-musl", "-march=armv8-a"` ExtraCflagsCC += `, "--target=aarch64-unknown-linux-musl", "-B/aarch64-linux-musl-cross/aarch64-linux-musl/bin", "-I/aarch64-linux-musl-cross/aarch64-linux-musl/include", "-I/aarch64-linux-musl-cross/aarch64-linux-musl/include/c++/${gccVersion}", "-I/aarch64-linux-musl-cross/aarch64-linux-musl/include/c++/${gccVersion}/aarch64-linux-musl", "-march=armv8-a"` ExtraLdFlags = `"--target=aarch64-unknown-linux-musl", "-B/aarch64-linux-musl-cross/usr/aarch64-linux-musl/bin", "-L/aarch64-linux-musl-cross/usr/aarch64-linux-musl/lib", "-L/aarch64-linux-musl-cross/usr/lib/gcc/aarch64-linux-musl/${gccVersion}"` - ExtraAsmFlags = - '"--target=aarch64-unknown-linux-musl", "-march=armv8-a"' + ExtraAsmFlags = '"--target=aarch64-unknown-linux-musl", "-march=armv8-a"' GN_ARGS.push( `extra_ldflags=[${ExtraLdFlags}]`, `ar="aarch64-linux-musl-ar"`, @@ -268,3 +272,23 @@ console.time('Build Skia') exec(`ninja -C ${OUTPUT_PATH}`) console.timeEnd('Build Skia') + + +function findLLVMHomeOnWindows() { + const { LLVM_HOME } = process.env + if (LLVM_HOME) { + const clangClPath = path.join(LLVM_HOME, 'bin', 'clang-cl.exe') + console.info(`Checking ${clangClPath}`) + if (existsSync(clangClPath)) { + return LLVM_HOME + } + } + const commonRoot = ['C:\\Program Files\\LLVM', 'C:\\LLVM'] + for (const root of commonRoot) { + const clangClPath = path.join(root, 'bin', 'clang-cl.exe') + console.info(`Checking ${clangClPath}`) + if (existsSync(clangClPath)) { + return root + } + } +} diff --git a/skia b/skia index 7bfc95e8..bd56a010 160000 --- a/skia +++ b/skia @@ -1 +1 @@ -Subproject commit 7bfc95e8576e909bd0ecab9c9c6ff9280e2f473c +Subproject commit bd56a010b6941116cd1900276bf5201f9a9c73da diff --git a/skia-c/skia_c.cpp b/skia-c/skia_c.cpp index d1c9ea1c..04e76d12 100644 --- a/skia-c/skia_c.cpp +++ b/skia-c/skia_c.cpp @@ -1364,14 +1364,14 @@ extern "C" } } - skiac_image_filter *skiac_image_filter_make_blur(float sigma_x, float sigma_y, int tile_mode, skiac_image_filter *c_image_filter) + skiac_image_filter *skiac_image_filter_make_blur(float sigma_x, float sigma_y, skiac_image_filter *c_image_filter) { auto chained_filter = sk_sp(IMAGE_FILTER_CAST); if (c_image_filter) { chained_filter->ref(); } - auto filter = SkImageFilters::Blur(sigma_x, sigma_y, (SkTileMode)tile_mode, chained_filter).release(); + auto filter = SkImageFilters::Blur(sigma_x, sigma_y, chained_filter).release(); if (filter) { return reinterpret_cast(filter); diff --git a/skia-c/skia_c.hpp b/skia-c/skia_c.hpp index 68998188..243a170a 100644 --- a/skia-c/skia_c.hpp +++ b/skia-c/skia_c.hpp @@ -454,7 +454,7 @@ extern "C" // ImageFilter skiac_image_filter *skiac_image_filter_make_drop_shadow_only(float dx, float dy, float sigma_x, float sigma_y, uint32_t color, skiac_image_filter *c_image_filter); skiac_image_filter *skiac_image_filter_make_drop_shadow(float dx, float dy, float sigma_x, float sigma_y, uint32_t color, skiac_image_filter *c_image_filter); - skiac_image_filter *skiac_image_filter_make_blur(float sigma_x, float sigma_y, int tile_mode, skiac_image_filter *c_image_filter); + skiac_image_filter *skiac_image_filter_make_blur(float sigma_x, float sigma_y, skiac_image_filter *c_image_filter); skiac_image_filter *skiac_image_filter_color_filter(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22, float opacity, skiac_image_filter *c_image_filter); skiac_image_filter *skiac_image_filter_from_argb(const uint8_t table_a[256], const uint8_t table_r[256], const uint8_t table_g[256], const uint8_t table_b[256], skiac_image_filter *c_image_filter); void skiac_image_filter_destroy(skiac_image_filter *c_image_filter); diff --git a/src/filter.rs b/src/filter.rs index 3370b213..daf5c4d6 100644 --- a/src/filter.rs +++ b/src/filter.rs @@ -12,7 +12,7 @@ use nom::{ }; use thiserror::Error; -use crate::sk::{degrees_to_radians, ImageFilter, TileMode}; +use crate::sk::{degrees_to_radians, ImageFilter}; #[derive(Error, Debug)] pub enum ParseFilterError<'a> { @@ -264,9 +264,7 @@ pub(crate) fn css_filters_to_image_filter(filters: Vec) -> Option { - ImageFilter::make_blur(blur, blur, TileMode::Clamp, Some(&image_filter)) - } + CssFilter::Blur(blur) => ImageFilter::make_blur(blur, blur, Some(&image_filter)), CssFilter::Brightness(brightness) => { let brightness = brightness.max(0.0); ImageFilter::make_image_filter( diff --git a/src/sk.rs b/src/sk.rs index c58cd59e..a9123c36 100644 --- a/src/sk.rs +++ b/src/sk.rs @@ -12,6 +12,7 @@ use crate::error::SkError; use crate::font::{FontStretch, FontStyle}; use crate::image::ImageData; +#[allow(non_camel_case_types)] pub mod ffi { use std::ffi::c_void; use std::os::raw::c_char; @@ -750,7 +751,6 @@ pub mod ffi { pub fn skiac_image_filter_make_blur( sigma_x: f32, sigma_y: f32, - tile_mode: i32, chained_filter: *mut skiac_image_filter, ) -> *mut skiac_image_filter; @@ -3277,14 +3277,12 @@ impl ImageFilter { pub fn make_blur( sigma_x: f32, sigma_y: f32, - tile_mode: TileMode, chained_filter: Option<&ImageFilter>, ) -> Option { let raw_ptr = unsafe { ffi::skiac_image_filter_make_blur( sigma_x, sigma_y, - tile_mode as i32, chained_filter.map(|c| c.0).unwrap_or(ptr::null_mut()), ) };