diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 619cd5ad..a6c8ab5a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -65,7 +65,7 @@ jobs: - name: Install toolchain uses: dtolnay/rust-toolchain@stable with: - toolchain: 1.67.1 + toolchain: 1.79.0 - name: Build run: cargo build diff --git a/Cargo.lock b/Cargo.lock index 482cc009..c37b3735 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -49,15 +49,29 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "bytemuck" -version = "1.21.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "byteorder-lite" @@ -149,6 +163,15 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +[[package]] +name = "font-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02a596f5713680923a2080d86de50fe472fb290693cf0f701187a1c8b36996b7" +dependencies = [ + "bytemuck", +] + [[package]] name = "fontconfig-parser" version = "0.5.7" @@ -188,6 +211,19 @@ dependencies = [ "weezl", ] +[[package]] +name = "harfrust" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed72b8c689b8016a4de5f60010d6df3ea4b832cf3e1efb61f052997006687d9" +dependencies = [ + "bitflags 2.9.1", + "bytemuck", + "core_maths", + "read-fonts", + "smallvec", +] + [[package]] name = "image-webp" version = "0.2.0" @@ -314,12 +350,30 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + [[package]] name = "quick-error" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + [[package]] name = "rand" version = "0.6.5" @@ -435,6 +489,17 @@ dependencies = [ "rand_core 0.3.1", ] +[[package]] +name = "read-fonts" +version = "0.29.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04ca636dac446b5664bd16c069c00a9621806895b8bb02c2dc68542b23b8f25d" +dependencies = [ + "bytemuck", + "core_maths", + "font-types", +] + [[package]] name = "resvg" version = "0.45.1" @@ -475,24 +540,6 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" -[[package]] -name = "rustybuzz" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" -dependencies = [ - "bitflags 2.8.0", - "bytemuck", - "core_maths", - "log", - "smallvec", - "ttf-parser", - "unicode-bidi-mirroring", - "unicode-ccc", - "unicode-properties", - "unicode-script", -] - [[package]] name = "simd-adler32" version = "0.3.7" @@ -554,6 +601,17 @@ dependencies = [ "siphasher 1.0.1", ] +[[package]] +name = "syn" +version = "2.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6397daf94fa90f058bd0fd88429dd9e5738999cca8d701813c80723add80462" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "tiny-skia" version = "0.11.4" @@ -611,22 +669,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] -name = "unicode-bidi-mirroring" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" - -[[package]] -name = "unicode-ccc" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" - -[[package]] -name = "unicode-properties" -version = "0.1.3" +name = "unicode-ident" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-script" @@ -648,18 +694,19 @@ dependencies = [ "data-url", "flate2", "fontdb", + "harfrust", "imagesize", "kurbo", "log", "once_cell", "pico-args", "roxmltree", - "rustybuzz", "simplecss", "siphasher 1.0.1", "strict-num", "svgtypes", "tiny-skia-path", + "ttf-parser", "unicode-bidi", "unicode-script", "unicode-vo", diff --git a/crates/c-api/Cargo.toml b/crates/c-api/Cargo.toml index 7b8aa519..041c5338 100644 --- a/crates/c-api/Cargo.toml +++ b/crates/c-api/Cargo.toml @@ -4,7 +4,7 @@ version = "0.45.1" keywords = ["svg", "render", "raster", "c-api"] license.workspace = true edition = "2021" -rust-version = "1.67.1" +rust-version = "1.79.0" workspace = "../.." [lib] diff --git a/crates/resvg/Cargo.toml b/crates/resvg/Cargo.toml index 183edd55..972ab519 100644 --- a/crates/resvg/Cargo.toml +++ b/crates/resvg/Cargo.toml @@ -4,7 +4,7 @@ version = "0.45.1" keywords = ["svg", "render", "raster"] license.workspace = true edition = "2021" -rust-version = "1.67.1" +rust-version = "1.79.0" description = "An SVG rendering library." repository = "https://github.com/linebender/resvg" exclude = ["tests"] diff --git a/crates/usvg/Cargo.toml b/crates/usvg/Cargo.toml index a092a28d..985001ca 100644 --- a/crates/usvg/Cargo.toml +++ b/crates/usvg/Cargo.toml @@ -4,7 +4,7 @@ version = "0.45.1" keywords = ["svg"] license.workspace = true edition = "2021" -rust-version = "1.65.0" +rust-version = "1.79.0" description = "An SVG simplification library." categories = ["multimedia::images"] repository = "https://github.com/linebender/resvg" @@ -37,7 +37,8 @@ siphasher = "1.0" # perfect hash implementation # text fontdb = { version = "0.23.0", default-features = false, optional = true } -rustybuzz = { version = "0.20.1", optional = true } +ttf-parser = { version = "0.25.1", optional = true } +harfrust = { version = "0.1", optional = true } unicode-bidi = { version = "0.3", optional = true } unicode-script = { version = "0.5", optional = true } unicode-vo = { version = "0.1", optional = true } @@ -49,7 +50,7 @@ once_cell = "1.5" default = ["text", "system-fonts", "memmap-fonts"] # Enables text-to-path conversion support. # Adds around 400KiB to your binary. -text = ["fontdb", "rustybuzz", "unicode-bidi", "unicode-script", "unicode-vo"] +text = ["fontdb", "ttf-parser", "harfrust", "unicode-bidi", "unicode-script", "unicode-vo"] # Enables system fonts loading. system-fonts = ["fontdb/fs", "fontdb/fontconfig"] # Enables font files memmaping for faster loading. diff --git a/crates/usvg/src/text/colr.rs b/crates/usvg/src/text/colr.rs index b6d2ddf2..e616b2d0 100644 --- a/crates/usvg/src/text/colr.rs +++ b/crates/usvg/src/text/colr.rs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 OR MIT use crate::parser::OptionLog; -use rustybuzz::ttf_parser; struct Builder<'a>(&'a mut String); diff --git a/crates/usvg/src/text/flatten.rs b/crates/usvg/src/text/flatten.rs index e28910b9..adce6bed 100644 --- a/crates/usvg/src/text/flatten.rs +++ b/crates/usvg/src/text/flatten.rs @@ -5,9 +5,8 @@ use std::mem; use std::sync::Arc; use fontdb::{Database, ID}; -use rustybuzz::ttf_parser; -use rustybuzz::ttf_parser::{GlyphId, RasterImageFormat, RgbaColor}; use tiny_skia_path::{NonZeroRect, Size, Transform}; +use ttf_parser::{GlyphId, RasterImageFormat, RgbaColor}; use xmlwriter::XmlWriter; use crate::text::colr::GlyphPainter; diff --git a/crates/usvg/src/text/layout.rs b/crates/usvg/src/text/layout.rs index 3e9ced0e..bf5029e7 100644 --- a/crates/usvg/src/text/layout.rs +++ b/crates/usvg/src/text/layout.rs @@ -7,10 +7,9 @@ use std::sync::Arc; use fontdb::{Database, ID}; use kurbo::{ParamCurve, ParamCurveArclen, ParamCurveDeriv}; -use rustybuzz::ttf_parser; -use rustybuzz::ttf_parser::{GlyphId, Tag}; use strict_num::NonZeroPositiveF32; use tiny_skia_path::{NonZeroRect, Transform}; +use ttf_parser::GlyphId; use unicode_script::UnicodeScript; use crate::tree::{BBox, IsValidLength}; @@ -1361,7 +1360,9 @@ fn shape_text_with_font( fontdb: &fontdb::Database, ) -> Option> { fontdb.with_face_data(font.id, |font_data, face_index| -> Option> { - let rb_font = rustybuzz::Face::from_slice(font_data, face_index)?; + use harfrust::{Feature, ShaperData, ShaperInstance, Tag, UnicodeBuffer, Variation}; + + let hr_font = harfrust::FontRef::from_index(font_data, face_index).ok()?; let bidi_info = unicode_bidi::BidiInfo::new(text, Some(unicode_bidi::Level::ltr())); let paragraph = &bidi_info.paragraphs[0]; @@ -1377,26 +1378,38 @@ fn shape_text_with_font( } let ltr = levels[run.start].is_ltr(); - let hb_direction = if ltr { - rustybuzz::Direction::LeftToRight + let direction = if ltr { + harfrust::Direction::LeftToRight } else { - rustybuzz::Direction::RightToLeft + harfrust::Direction::RightToLeft }; - let mut buffer = rustybuzz::UnicodeBuffer::new(); + let mut buffer = UnicodeBuffer::new(); buffer.push_str(sub_text); - buffer.set_direction(hb_direction); + buffer.set_direction(direction); let mut features = Vec::new(); if small_caps { - features.push(rustybuzz::Feature::new(Tag::from_bytes(b"smcp"), 1, ..)); + features.push(Feature::new(Tag::new(b"smcp"), 1, ..)); } if !apply_kerning { - features.push(rustybuzz::Feature::new(Tag::from_bytes(b"kern"), 0, ..)); + features.push(Feature::new(Tag::new(b"kern"), 0, ..)); } - let output = rustybuzz::shape(&rb_font, &features, buffer); + let variations: Vec = Vec::new(); + + let shaper_data = ShaperData::new(&hr_font); + let instance_data = ShaperInstance::from_variations(&hr_font, &variations); + let shaper = shaper_data + // Initialize the builder for the given font + .shaper(&hr_font) + // Set the instance + .instance(Some(&instance_data)) + // Build the shaper + .build(); + + let output = shaper.shape(buffer, &features); let positions = output.glyph_positions(); let infos = output.glyph_infos();