From 277f3f75ec11daa29983a1f153b5cf5afaff427a Mon Sep 17 00:00:00 2001 From: Laurenz Stampfl Date: Fri, 3 May 2024 16:06:29 +0200 Subject: [PATCH] Bump deps --- Cargo.lock | 938 +++++++++++++----- Cargo.toml | 2 +- src/render/text.rs | 6 +- .../hanging-on-vertical.png | Bin 2207 -> 2184 bytes .../rtl-with-vertical-writing-mode.png | Bin 1018 -> 1037 bytes .../simple-case.png | Bin 1716 -> 1749 bytes .../ref/resvg/text/lengthAdjust/vertical.png | Bin 2312 -> 2273 bytes tests/ref/resvg/text/textPath/complex.png | Bin 5241 -> 5187 bytes .../resvg/text/textPath/writing-mode=tb.png | Bin 3953 -> 3951 bytes .../resvg/text/writing-mode/inheritance.png | Bin 2220 -> 1768 bytes .../text/writing-mode/japanese-with-tb.png | Bin 1709 -> 1644 bytes .../mixed-languages-with-tb-and-underline.png | Bin 1596 -> 1652 bytes .../writing-mode/mixed-languages-with-tb.png | Bin 1844 -> 1865 bytes .../text/writing-mode/tb-and-punctuation.png | Bin 1881 -> 1879 bytes tests/ref/resvg/text/writing-mode/tb-rl.png | Bin 2220 -> 1768 bytes .../text/writing-mode/tb-with-alignment.png | Bin 2253 -> 2331 bytes .../tb-with-dx-on-second-tspan.png | Bin 2924 -> 2872 bytes .../text/writing-mode/tb-with-dx-on-tspan.png | Bin 2109 -> 2090 bytes .../tb-with-dy-on-second-tspan.png | Bin 2726 -> 2665 bytes .../tb-with-rotate-and-underline.png | Bin 2537 -> 2532 bytes .../text/writing-mode/tb-with-rotate.png | Bin 2181 -> 2180 bytes tests/ref/resvg/text/writing-mode/tb.png | Bin 2220 -> 1768 bytes .../resvg/text/writing-mode/vertical-lr.png | Bin 2220 -> 1768 bytes .../resvg/text/writing-mode/vertical-rl.png | Bin 2220 -> 1768 bytes 24 files changed, 680 insertions(+), 266 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f45e04c2..d34d639a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,13 +10,19 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -34,50 +40,74 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.11" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" dependencies = [ - "windows-sys 0.52.0", + "windows-sys", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys", +] + +[[package]] +name = "anyhow" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -94,15 +124,38 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" + +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2" +dependencies = [ + "arrayvec", +] [[package]] name = "base64" -version = "0.22.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bindgen" @@ -110,7 +163,7 @@ version = "0.69.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "cexpr", "clang-sys", "itertools 0.12.1", @@ -141,9 +194,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[package]] +name = "bitstream-io" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06c9989a51171e2e81038ab168b6ae22886fe9ded214430dbb4f41c28cf176da" [[package]] name = "bitvec" @@ -157,17 +216,23 @@ dependencies = [ "wyz", ] +[[package]] +name = "built" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41bfbdb21256b87a8b5e80fab81a8eed158178e812fd7ba451907518b2742f16" + [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.14.3" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" [[package]] name = "byteorder" @@ -175,19 +240,27 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "065a29261d53ba54260972629f9ca6bffa69bac13cd1fed61420f7fa68b9f8bd" dependencies = [ + "jobserver", "libc", + "once_cell", ] [[package]] @@ -199,6 +272,16 @@ dependencies = [ "nom", ] +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -207,16 +290,16 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.52.0", + "windows-targets", ] [[package]] @@ -232,9 +315,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.0" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c21025abd42669a92efc996ef13cfb2c5c627858421ea58d5c3b331a6c134f" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" dependencies = [ "clap_builder", "clap_derive", @@ -242,9 +325,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.0" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458bf1f341769dfcf849846f65dffdf9146daa56bcd2a47cb4e1de9915567c99" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", @@ -254,18 +337,18 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.0" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299353be8209bd133b049bf1c63582d184a8b39fd9c04f15fe65f50f88bdfe6c" +checksum = "dd79504325bf38b10165b02e89b4347300f855f273c4cb30c4a3209e6583275e" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "4.5.0" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" +checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" dependencies = [ "heck", "proc-macro2", @@ -297,9 +380,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "console_error_panic_hook" @@ -329,18 +412,18 @@ checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" dependencies = [ "crossbeam-utils", ] @@ -384,9 +467,9 @@ checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" [[package]] name = "either" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] name = "equivalent" @@ -401,7 +484,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -438,14 +521,14 @@ dependencies = [ "cfg-if", "libc", "redox_syscall", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", "miniz_oxide", @@ -477,9 +560,9 @@ dependencies = [ [[package]] name = "fontdb" -version = "0.16.1" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3890d0893c8253d3eb98337af18b3e1a10a9b2958f2a164b53a93fb3a3049e72" +checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" dependencies = [ "fontconfig-parser", "log", @@ -496,13 +579,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] -name = "gif" -version = "0.12.0" +name = "getrandom" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ - "color_quant", - "weezl", + "cfg-if", + "libc", + "wasi", ] [[package]] @@ -523,9 +607,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "half" -version = "2.3.1" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ "cfg-if", "crunchy", @@ -533,15 +617,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "home" @@ -549,7 +633,7 @@ version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -577,20 +661,35 @@ dependencies = [ [[package]] name = "image" -version = "0.24.8" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23" +checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11" dependencies = [ "bytemuck", "byteorder", "color_quant", "exr", - "gif 0.12.0", - "jpeg-decoder", + "gif", + "image-webp", "num-traits", "png", "qoi", + "ravif", + "rayon", + "rgb", "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d730b085583c4d789dfd07fdcf185be59501666a90c97c40162b37e4fdad272d" +dependencies = [ + "byteorder-lite", + "thiserror", ] [[package]] @@ -599,22 +698,45 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" +[[package]] +name = "imgref" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" + [[package]] name = "indexmap" -version = "2.2.2" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown", "rayon", ] +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + [[package]] name = "iter_tools" -version = "0.4.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a621162e5c4229abff44d46655dcb777f6064daa851e046df17baf74c9ddf079" +checksum = "0b8a2fd5781e38f94f3e9618169120858f9aaa5512239c0ea496fc4d656fffd1" dependencies = [ "itertools 0.11.0", ] @@ -639,24 +761,30 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jobserver" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] [[package]] name = "jpeg-decoder" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" -dependencies = [ - "rayon", -] [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -691,36 +819,47 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.154" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" [[package]] name = "libdeflate-sys" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67921a7f85100c1559efc3d1c7c472091b7da05f304b4bbd5356f075e97f1cc2" +checksum = "669ea17f9257bcb48c09c7ee4bef3957777504acffac557263e20c11001977bc" dependencies = [ "cc", ] [[package]] name = "libdeflater" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a31b22f662350ec294b13859f935aea772ba7b2bc8776269f4a5627308eab7d" +checksum = "8dfd6424f7010ee0a3416f1d796d0450e3ad3ac237a237644f728277c4ded016" dependencies = [ "libdeflate-sys", ] +[[package]] +name = "libfuzzer-sys" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +dependencies = [ + "arbitrary", + "cc", + "once_cell", +] + [[package]] name = "libloading" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-sys 0.48.0", + "windows-targets", ] [[package]] @@ -731,9 +870,9 @@ checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -741,9 +880,18 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] [[package]] name = "maybe-owned" @@ -751,11 +899,21 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4" +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "memmap2" @@ -782,6 +940,12 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nom" version = "7.1.3" @@ -792,6 +956,55 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.18" @@ -809,11 +1022,13 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "oxipng" -version = "9.0.0" +version = "9.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28e5c341ef78a228e47a551bfd15ff885d8c501af49f953358763a538c01f14d" +checksum = "3f398c53eb34e0cf71d9e0bc676cfa7c611e3844dd14ab05e92fb7b423c98ecf" dependencies = [ "bitvec", + "clap", + "clap_mangen", "crossbeam-channel", "filetime", "indexmap", @@ -826,11 +1041,17 @@ dependencies = [ "zopfli", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pdf-writer" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644b654f2de28457bf1e25a4905a76a563d1128a33ce60cf042f721f6818feaf" +checksum = "24e9127455063c816e661caac9ecd9043ad2871f55be93014e6838a8ced2332b" dependencies = [ "bitflags 1.3.2", "itoa", @@ -840,12 +1061,12 @@ dependencies = [ [[package]] name = "pdfium-render" -version = "0.8.17" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165f53a33ddbf09c92fd46750b7ffdc9ca77034f040c97ee7f25b6d99a86662e" +checksum = "f18a35caa489bb0b6f52c3318aefdc1a13262770697835d7692928186575560a" dependencies = [ "bindgen", - "bitflags 2.4.2", + "bitflags 2.5.0", "bytemuck", "bytes", "chrono", @@ -877,11 +1098,17 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad78bf43dcf80e8f950c92b84f938a0fc7590b7f6866fbcbeca781609c115590" +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + [[package]] name = "png" -version = "0.17.11" +version = "0.17.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f6c3c3e617595665b8ea2ff95a86066be38fb121ff920a9c0eb282abcd1da5a" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -890,11 +1117,17 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "prettyplease" -version = "0.2.16" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" +checksum = "5ac2cf0f2e4f42b49f5ffd07dae8d746508ef7526c13940e5f524012ae6c6550" dependencies = [ "proc-macro2", "syn", @@ -902,13 +1135,32 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "qoi" version = "0.4.1" @@ -918,11 +1170,17 @@ dependencies = [ "bytemuck", ] +[[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.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -933,11 +1191,91 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc13288f5ab39e6d7c9d501759712e6969fcc9734220846fc9ed26cae2cc4234" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + [[package]] name = "rayon" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -964,9 +1302,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", @@ -976,9 +1314,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", @@ -987,20 +1325,19 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "resvg" version = "0.41.0" -source = "git+https://github.com/RazrFalcon/resvg#b908baf1a2b7bd724a7896f29bf56e2d666b87ff" +source = "git+https://github.com/RazrFalcon/resvg#45f086762ff10b5443d472f09d5caabdf2a54de7" dependencies = [ - "gif 0.13.1", + "gif", "jpeg-decoder", "log", "pico-args", - "png", "rgb", "svgtypes", "tiny-skia", @@ -1045,15 +1382,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -1062,7 +1399,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88117946aa1bfb53c2ae0643ceac6506337f44887f8c9fbfb43587b1cc52ba49" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "bytemuck", "smallvec", "ttf-parser", @@ -1074,9 +1411,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "scopeguard" @@ -1086,9 +1423,38 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.21" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + +[[package]] +name = "serde" +version = "1.0.200" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc6f9cc94d67c0e21aaf7eda3a010fd3af78ebf6e096aa6e2e13c79749cce4f" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.200" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "856f046b9400cee3c8c94ed572ecdb752444c24528c035cd35882aad6f492bcb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_spanned" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] [[package]] name = "shlex" @@ -1102,6 +1468,15 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "simplecss" version = "0.2.1" @@ -1128,9 +1503,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "spin" @@ -1152,9 +1527,9 @@ dependencies = [ [[package]] name = "strsim" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "subsetter" @@ -1223,21 +1598,40 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + [[package]] name = "tap" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "target-lexicon" +version = "0.12.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" + [[package]] name = "termcolor" version = "1.4.1" @@ -1247,6 +1641,26 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "thiserror" +version = "1.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tiff" version = "0.9.1" @@ -1299,6 +1713,40 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "toml" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "ttf-parser" version = "0.20.0" @@ -1356,7 +1804,7 @@ checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" [[package]] name = "usvg" version = "0.41.0" -source = "git+https://github.com/RazrFalcon/resvg#b908baf1a2b7bd724a7896f29bf56e2d666b87ff" +source = "git+https://github.com/RazrFalcon/resvg#45f086762ff10b5443d472f09d5caabdf2a54de7" dependencies = [ "base64", "data-url", @@ -1394,6 +1842,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + [[package]] name = "vecmath" version = "1.0.0" @@ -1403,17 +1862,29 @@ dependencies = [ "piston-float", ] +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1421,9 +1892,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", @@ -1436,9 +1907,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -1448,9 +1919,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1458,9 +1929,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", @@ -1471,15 +1942,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -1503,53 +1974,22 @@ dependencies = [ "rustix", ] -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys", ] -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-core" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", + "windows-targets", ] [[package]] @@ -1558,122 +1998,81 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.5" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" -dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" [[package]] -name = "windows_i686_msvc" -version = "0.48.5" +name = "windows_i686_gnullvm" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" [[package]] -name = "windows_x86_64_msvc" -version = "0.52.0" +name = "winnow" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "14b9415ee827af173ebb3f15f9083df5a122eb93572ec28741fb153356ea2578" +dependencies = [ + "memchr", +] [[package]] name = "wyz" @@ -1702,6 +2101,12 @@ dependencies = [ "typed-arena", ] +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + [[package]] name = "zune-inflate" version = "0.2.54" @@ -1710,3 +2115,12 @@ checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" dependencies = [ "simd-adler32", ] + +[[package]] +name = "zune-jpeg" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec866b44a2a1fd6133d363f073ca1b179f438f99e7e5bfb1e33f7181facfe448" +dependencies = [ + "zune-core", +] diff --git a/Cargo.toml b/Cargo.toml index 6adaba1d..d3b73d06 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ clap = { version = "4.4.2", features = ["derive"] } clap_complete = "4.4.3" clap_mangen = "0.2.14" fontdb = "0.16.1" -image = { version = "0.24", default-features = false, features = ["jpeg", "png", "gif"] } +image = { version = "0.25.1", default-features = false, features = ["jpeg", "png", "gif"] } miniz_oxide = "0.7" once_cell = "1.18.0" oxipng = { version = "9", default-features = false, features = ["filetime", "parallel", "zopfli"] } diff --git a/src/render/text.rs b/src/render/text.rs index 3460ddfc..a2d18d5f 100644 --- a/src/render/text.rs +++ b/src/render/text.rs @@ -245,9 +245,9 @@ pub fn render( let name = font_names.get(&font.reference).unwrap(); - let gid = glyph.glyph_id.0; + let gid = glyph.id.0; let ts = glyph - .transform + .outline_transform() .pre_scale(font.units_per_em as f32, font.units_per_em as f32) // The glyphs in usvg are already scaled according the font size, but // we want to leverage the native PDF font size feature instead, so we downscale @@ -517,7 +517,7 @@ pub fn fill_fonts(group: &Group, ctx: &mut Context, fontdb: &fontdb::Database) { }); if let Some(ref mut font) = font { - font.glyph_set.insert(g.glyph_id.0, g.text.clone()); + font.glyph_set.insert(g.id.0, g.text.clone()); } } } diff --git a/tests/ref/resvg/text/alignment-baseline/hanging-on-vertical.png b/tests/ref/resvg/text/alignment-baseline/hanging-on-vertical.png index fa89c9ad443fe6131ea6c3c967a8ee85c3d3cda4..5a6724c94bdb1eb356a32fddeefab8b14ae2509e 100644 GIT binary patch literal 2184 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 diff --git a/tests/ref/resvg/text/direction/rtl-with-vertical-writing-mode.png b/tests/ref/resvg/text/direction/rtl-with-vertical-writing-mode.png index 084a90d22dfd64bd071c75731f093a1fa28c72da..feb2ccac061843970d72977ecb6126a04220367e 100644 GIT binary patch delta 656 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 diff --git a/tests/ref/resvg/text/textPath/complex.png b/tests/ref/resvg/text/textPath/complex.png index 0273f37a98b037bb89a1d38d640fe820da064024..8a7fcdc032e7886aa9924a4a8a11763e06bed326 100644 GIT binary patch literal 5187 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 diff --git a/tests/ref/resvg/text/textPath/writing-mode=tb.png b/tests/ref/resvg/text/textPath/writing-mode=tb.png index e08a472d7d75815630f6dd21c7f466521411d6cc..d9f12bafa62ada4c0bc711c17e1173e94046a533 100644 GIT binary patch literal 3951 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 VS&t)9Up~?ReH|0+T21?ye*t&vQl0<+ literal 3953 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 VG0Kx0e_v?;R7p#*TK-Mge*hRBX@dX& diff --git a/tests/ref/resvg/text/writing-mode/inheritance.png b/tests/ref/resvg/text/writing-mode/inheritance.png index dc144029296167a6c2b972d4639a50550125321e..eda45a92f176611e272065e43af5f66da361d8a8 100644 GIT binary patch literal 1768 zcmZ`)dsvbO7e@j?9R*%sGP74d(w5Bo7hdc2l1W~svmBz7C~8vb%<_geynj?Z+x^n>2>mp|fS{xu&s2)_ODcl-~A5+64!@|zAwH6VjmWOM(Yt$#JmNVVW z<&ud$dHk1e9<*Fa-M^B)Dd|f**0fx<#@e?>cx1OQWKWH=nX9Hc;ptZ8?$8=2hGT?g zpZF6%*flj*;OcuAoopQ?TfvI<@QN(iNLN6a2*M1}?@elVe9%YMK>!)Dcn;o({afrW zX|U5aS!aNrc5dPMl&lm4jle68vX$?9-vu^mCvZxNG8W%E?$VjHAHxy5{I&ScaqqkY znxHLcuGpKaVyyxl$s9%IU54zkUKNq}6*RW(0e|*l`t0gyS9D^}mg(n*f#`T0`FL0)Ie@`i zr1*RZPA?e^tqc`PA)UK4zQu6_GwfHW6cZE=(Oj_|8k^!v*$l@6H$t5{p|LGw{%pqN zMWxT)%9!*7drv1n1&^6>=;2e3`af}h858rCJ7-dhHm?%S=J zfAz+48s_O~Nmnpn{!2_lO!2dgucu=uQOAZA<5wZ~WfW6}ok_FmvakURdS*Km)0^p% z`6&49)Npc$BEHJJr~fz}9(jwk3X{bj(sCHL2{E(12-bJ{)_Th(S|}r97%)xlTt1i| zLDT*2<+aY#9^uVW;M|7?4;$kG7hb$h*{W|S8YBK-kSh&{V67u)zuyNeBhR)w2hiUM zmqia=pBu$ywAPm0e@o^?){uz_R=H;b9qtGNUKDmOUD;>f{6xd@d8r+u)Vivgm^2?P zVcI`2qO=z3S+)FhTGTErX2`5+en{W2$K7T||L2_i*#~L;nMOacIB~p+LR+q|UPyN)-*62TOyhLva;N(!Qh5ST}QsGj`lx zj``=?UpL&`y_oFaO~+uF7LI4lOw!O9`-u|g)B#hG)9X&bshOZ5ZDi}bFSE&w>UMl) zd6i2n z2ELl)(d_nE(#TLF_yLm$8uwJN_F9wA|D;|(DP*yaM5*g6gCu$~NZ(h`JbSg=3%VA% zpPWG1K+NRu|N0U#S0`%+3T~5vxa9y@{=@uS}^S_6K za&-wYC#xG)wf!c{csD_2GEvX|Qk}iv3Y5Ezv2&p|shw030h8gY%i=$=dy@wL5hjbq z{kZtXAX#z&3{hFU6HsQ#o68XO)d{=6B3OvS$2s7ix6#v_h`$2l z%$8hMt6onqmXlgN0rJE$e^y}(FUmeI*%YT9Ryx3;7=;Iv+o z*lq^Syrz9CZWOZU;!7)sT?+;O!N>njoB!nQdvtZEHqup#16u!1!w;3EUI6qDc=rXU oR6yr)J#5ayM}#wU(s{e>P1@xXgFyp5$`1x1AM|z=I|pa}1_Js4n*aa+ literal 2220 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k8A#4*i(A9Mz_cvDC&U%V9R-wxKz)5ZP3SN3r0srBXc3_z`#H|J3AoT-{0TQ&ks`pRuLT?9jxMH z3ra~z5!5RnAV5$JTmcIU3!DvS00WkhkrBd8e}9z|$a+{3gMk0 z$dGXcJA7}cmIKd zhYlY(dhGbgQ>V|KJAdKgrOQ{YUb}wd=B?Xz@7#Ov@X_NZPoF)1`Rdi{H*ep)|M2nC z=PzHsegE;}=da&?{{H{>?|0NMLk0$xE1oWnAr-gY-u)RKk}7ljW92&@<|9Jhj+%`r zdX5I3X^9h~6}+d-^4vK!G9z)KSR!}iq-mnl)}~0Qskq$C3Yz8Tmf;Yr7Np=<^KbIL z=XUNlpIs{H6TN@?``_E2Z`b}UIRDqK-17Rwmm6GQnnm<&0QiqXaKQsm}d?Rq{@*7QY;RCe3t6W4LnAWhtBU3d^|*t{FG(VP5q&=qdZ6 zJo8=~1;@7wrfKaLSj-n<#NEMurEq(FM-ip;_$B6G z%6%d)V0xs}H|7=Tj4RnilQ=V30!}ksVmOt`%K1z5fS%ZdsDQ+<3EB>}$C!e6wXSh} zvRIKLHo@GXcXLBb9hXBq5BG_~3(|hK_gJ&MQa;L5#J$4wpTfFB!VFW7Gf!e#m8EgS zHtk-R{F!f3HVWs$7~URiRKR-A__Z+l7p$AW)vl+Hc>yw$XJZ*FSZk{S+WfkuIpKU&kJc6M-xP4K)i zd4-$S;|neI3_&${uixs{3H^9GHR-fm#e066K$!wYXS0wwm#eC^lGHY=N*y$ozc9y+k_r4ci!cXJ$&Ku-gTUF6tuQ%;ZJ+J zU2@g_2|+J*g|lyL2)JIgu=+1k>9Q&37yMT0y*TynAKwe6>6*sRKl#o0x`zLu>7plF z9KyxCR(F>>mH)^p+Z=W$`aWl1EHCKVsrN%NZU1`SG}f6vZA;F(Xv98} zdtvAIl)3W`$6WpJxo1niXU-^HTV&W6Q_QmKE@xK4%iasM0!Nu9-C^H+S$l3)LE=+} z8+U7dXvOm8e=97Tu>8=}{f|~vINsVc)%BRHY>&eGzQAj~_l~n(+IncEn^wi$3b6@4 zOe!xN<`kMX&+eL-0RM*b8#q}mzh%0aD9#aN;n=kN%*oU8_iPtzb1iN>vTp7BBOImS z`reNiPW~6Hzq_2jswa?dCnw`Gxw{iq#+o%=IUqOTq(OFlX5zOs4|UnMR!lo*xk}NS zA);jJ$k zj44Vhbfg`wOj@*P(dsF#4<$oZ+~E^~7XwH|1dRFTx4=}D`ZMC_YWM`!H&;u6%9)w< XOu>&mImMU`g6jrPS3j3^P6iRU^wIayg*sjI7NX=!2VDkvzx z6eL?DH8r)qzMi8sdk)ZuMI}Lg!3+%<{{v=B`NQ!gMuhW+*(aWYIXmC^%60!crT0B( zSL!!=X8{G3G~*A3R<`f|vEBXoq@sLUUUn9DWO!Kc$=!WE9_}s%b|#M=PgwIbPWj3a zafxHMxL6jxRl2Uba&gP{d6(B6zN&M<^z*kL*6SuTyWWiGoYy+@V($9Fx<+Q+75gq6 zm}t@QH-E!~_KjP&?@0Djl$ZU;zGA_>)2t2;m>6H!yt%QU;p29%hYSqNlRaG=Ln>~) zz56s+I#%TP$IX8o6*HSYJ9y6zDzCh=^c@KJ-R(AcnYZx6{BL(s*bbQ~URZd!`tbYT zO8S0rwP}9uRCZendseXq2JQJi@3*FtjX#${zkm~mVha)>t`OVL#d^sTMKprDGIYw? z+1oeu#Ygf;wlSLY2spKAELml8<(%w8&#A%_9{o9IMyoJ zFG*?0>CHCS$Dkl*^8U8NF1F3q7v7cdru}WRc_nis&w2M<%NcwB zwXHsS9_)t`;f+&x&tLV(P%hpVnL&Ish6wVmnK z=L4Q6Br^X0$n^O2r|Kb(%ASZBYMC8dl()vLb2!v(y65@r_vc?eE#fm`yY=RNwSs8w zg*XdFPW`aIB`+IK-1t(oll9~O)^GDuoSx`y$-1w3qB3K7@?J&hYtGg$g`V(d_U&wrE58tha%tCD$x0No0 zoiAb(n$x_}W0PZwiBD)F^8|K-*r{&>cCuYo{jIpw_d?(AoeKY)GgSZI=9_8Ferule zByJ`1Fvr=(=kredvDk7pTE*NY?3zQiM7pucO^&rGbH1=n4EDVsb^I20X8(Z@&06Ot zTs{+%w>iC=diaaQ33kqNheG1g)Ke}-&+ucJ#IJNPcE&QFZGuLnY(7UDpR{`vFfNmb&q?K@z_MTWbDDgdR;8c4RNrA@@4U)W%u&tEp;~HkNUpq*_eQ0?Zn=}RzKKK~ zcIj65q}*`rh{O9=YEg`TRLmTO#6Mb0XmnE9(cjE@I?q46?q=<`Q_eLB4d4VgL6K2X z^zLqbt1kYZ!f2TQ%zY%~68BmDGbd`Yj%nEQ{f@ujq%T~Ho~XBm{$0BHNY@=udF1Kp K=d#Wzp$P!eS{QTy literal 1709 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k8A#4*i(A9Mz{DHi6XFWwjvP>5Utd>OhtFKGdsSv4xf&vI5HZ~T>2n!2C)&f+Pl9GZfg2oOF4Gj(sh70=n`9av8o}NI4k&zKx z3dqpW(E*ZLT3X10y1Kd$u7-vNkfE-wjx39Z&Bw=wDa*^tiz$dzM8bSsG*Dt)NswP~ z0|O%yGYcylI|mmx4=*3TfS{1Dh^Uyjw5+^>lCr9rx`w8c!gh`X9OrJSp=B&93 z7A{z{c*)Xb%U7&iy?WK^HS5=J+`MVWj$OO=?Aw3fz@a0@PMtY>?)-&|m#^NqdGG#% zhmRgVdHVd>^A|5)y?*=V?Ys9MzI^-s>-V3(+dLF+GB7YN^mK6yskrs_Zg_EUxJcW> z&3z1l9n1&Ix|lS}WM+pvQt>nNG}t@)UbW!^r}qg~%gPPTN*FNd2;9$4d3!NoO>@f4 z9*J+$_I-B}_YOaQW}d0?T-)M3Ui#`m$4bxt72-JAXye48*dl;L#57#dJ1y!Viz<3z zcbmx6a0DmNeGe2{?K1IlQvx-jWer5On^l zH_)ms_pFI$CY%do8Rx3_sBJ~W_ufvYxdeSB{Ejbn*VK0tXcP- z>5HE_epXp62)1WZ_Jm84FRfVK2HaZjt=rslINGdFz^Q7D+O$m;ySk1Cg*`rU?Gyjv z)oIhO=Zo(8+P-^2o%n^d#fs^Q!V5~vYJ18>gKqFC?2@_FrO~i0vCnDN0^hF-DlacI z-N7lz`}R`uvvJ#lyE2_?B^gs+PGme-e*p z&blA@?;PA*7OtJH;9}*{-I?80Ou<-ANd4H80JHEXx&Zu_s zb9i>hBrwP^#mHxKY{QiUTfBmt|CAd1O}Bq?Tw;sxLlXhc`7PIeHou+le!fHYUzbac zPcF~CAQygv_op7$+RaXvoUTYUe_L@T?ZkFjgR36?0+QU9n}ezqRo@z%ojgy`NPb!M z{Tp0ASMe_MUFb8RuGir1-%EZcI-(8UzR;hkaH(G0$GrVE$InM>KGp0VX&o)!50@w> z$uC(Vx~!Sm_0*}|+r@6(S`s+(1p8Tot{j}t|e9=+qlZa%MmQr)yVUfQl^*l;> zmQCYdx?Mmsqfzr)zwZP?{RAspmn!~=3)2&-KJIs&z}329alkL8iH9yu&s5H<1UecwuqFwod@wa>`~9!N>Q2k*=Cw^8S0_#QBCE7;Y3LpU2XOlI zh;wi|Yg1JAOe5}-I!ZQxmdKI;Vst04-q`$^ZZW diff --git a/tests/ref/resvg/text/writing-mode/mixed-languages-with-tb-and-underline.png b/tests/ref/resvg/text/writing-mode/mixed-languages-with-tb-and-underline.png index 08a5e22864abad1f9475a748d0f2522025ddd92b..615783acb2cd36bc1a8b7667126a35e29cffe183 100644 GIT binary patch delta 1483 zcmV;+1vL7+4D<|;B!4?eL_t(|+U?wHY}NH0$MN^hIi8jt8e5#$)^Y1xS3qQDkh038 z4wGS&xg{Gj$|jec-MvJE#s{W{cp)NamFg2K)}mIC02+fv4H)BEvn3;201{P|qPApj42kKoVTbLDn*or5vP-E)J3X$x*s``xaH) zL^rD_6C@gtBuiMsFn^$qe~>244T;an+DZ3z27@Ue!^?~iBpMJHOwrfe_Qo0F$nyGK zkX&j8?H{{Q5dWqwh#-OpB8VV@2=e0uDWr^nK`KZH5F4P$PU;IoFYi{AXPL`MvBzDn}08ErI|^jdV3o8QZ7jJ zAmvOW22h`w(?TO-0e}R5phS?M+upe?G%(t2Z$5$CLA4-ZK}r}$4rKN+?(Q2|F@8mn zAkl;TlG{kq3o>gNO^gQsO1aZ>NSJfTR@&LdwxWH5KH&f#u&uW{dDU%i7?3u0v4b6h z4ip|_M_+df5`SuBHBd0X)yWVV9a$kjN*NCWfW(bCbVU3A5J;-7Pb155*E(9IHJf`r)iK2H;kG*+%3xs^tiG7}iV z0w(*0gc(_v5j##7_4-V>lKtA>$$r^PKKDBZxw0YM9Dk~02Y!Ch!=tv0TR*2I-F#j4 z|Jie&tX+5JOJg=xZLZvM`i6^J)6Mx*MjQ_#>v!yD6Qigf(q7cbUOp$AYd3#!4T&Bk z$#j0xZw*OuDrYj43#swnfIO)SB8VV@2qK6ef(RnW_X3h4%?cjp);~4PyfAVoCM z!&)X#K7V=Tgcm3fBrHfRd-#YNM^?UoT*P5sW#};=Np4^sMS?^R@@KkPN69fDHSDH? zvjmAAq=pV&r~DWYm_nL_Akl-AvX*^J=?79w!Zjou2wcd=v`_@~nF}7{ZuYa0@q&Z{ ziE#lh(8Qt>cg1^njT@=<4GDizKZ!9j@0zvDZGW#sjeZRK}wm+ zP+$_>bn**9LW5k*VVzB delta 1443 zcmV;U1zh^{47?1GB!2@*L_t(|+U?tWXw_vL$MJXPtS#NvE?u0HIh!&^HSK~~Nwu_# zVG%L9kfg3$S0V|csBEW;6{#gzRMY27;SzK>Cj$@o&`TldL$;1uN(~QPwHYb z<_nTmAhivV;WLr}3V)<+5`r99AV;0Kbkb{rqz}mHnemDiK?D(`H&JrQPwIq2ca(oZ z@+)~{36eUHiFAaFD>Z_I1b->u6;zV zTPKL$sS6^AAc6=Yh#-ReUqK4V?H44AB0)lcOy!DxK~5niNC=S0Y~)pz6@78^_blsc z6YH2GNC=QC*+ZhAb_)^)G$g74414hAR{R07o>m_ z1o8S^5P!-jN&+clq#&V(`s5^#3z$a~D5lC^;f4a)#SY@pU!z^b>0%v&h|<6|E)pcn z_aUoT$P;C2hkeNtJV`y3z&Sj?U_nBFR5Sh{9qM(la3!(N_auIAES>wWgUpy;+YqWG z{^~#HEg#Z4enoA=J&Bo#Nv~GDHFnkL4=Y+me1BH<`Dx9y4e3-$4~8Wx!h>`%pOGb> z9R3sEv7Nmndi$j_B*Y9E#FY$5njtw1=Ts(gF~bG%q%Mdcf(RmrAc6=Yh#>z7NGY>< zoyO5Cs~ZIg4>FQZ*~J`6CO=uZmT`iF2DzIq-XYH=D?LD>ET)@>iTnYil;=5DkPsmC zbboOd`~l>4_VBJCsRw~O_?5^1^n@J7HJl|#2#|4XW;KOG8sme zAYnj`VM0~oNvpYqJDJTwn)r-PcCm!Pf`6nMB!_3%&BmeYkJ-q5%;Z`w=X_44n5auu z2$0K&^D##`Lqda$=29|%M@X=W3_-$z{8YGulG;uW3+08Pt z1WA`&)_Jt^Qqpa27UfLjM&{ATO@gEzB*H{qV`16aqBd6ZBR{i&H>szYX3i8O)LmB5 zg^R|opprtDEN^=S=^vzKF~b>84KsDrvy%6jMX?~M2N}+zyiH4H=OKI9ODEs4hGjfW zjO!RBNSG%io6>2IS2vRFl9jSJLzD3ZJxCEmkb@TlC>6vAB8U-05J3bnf(T*+5yS{0 xh!I2(BZv`15VKz(ZNzN&_DWFY2a!gt`VE+7`Tx?&vIYPE002ovPDHLkV1lGuhVK9X diff --git a/tests/ref/resvg/text/writing-mode/mixed-languages-with-tb.png b/tests/ref/resvg/text/writing-mode/mixed-languages-with-tb.png index 3fa1953b6ffcbfcda7e1fbc031cbbb7622e63cb6..5bec9468f5b9534254ed63ff0694c861c7090e9e 100644 GIT binary patch delta 1812 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 VE(0zV8wLOX002ovPDHLkV1m-LB0K;9 diff --git a/tests/ref/resvg/text/writing-mode/tb-and-punctuation.png b/tests/ref/resvg/text/writing-mode/tb-and-punctuation.png index 10941c487e9be6734daec994945722ba009f4c08..60eb3edfc8cc155db68d56076a1b34b85791e52d 100644 GIT binary patch delta 1835 zcmY*adpOhkAK%tIM86rs+~R94JBpnaNfIm5Vneya5LugX$m1TutfLx5?uJY!mrf)l z^g~WM=F-pYpjr9B zkLU}ENYau;wRJ=E`SR@Qr|MA}@a}WuUgxTi3+{OqHgv(J?lEO)m;B;v2k6z(AO&ch zOjWhTyTP$#`3Y9{g%IRMsa=q|RY^mQ@VJie&a8sfWdGOfEwE3#dQgX))#m4$PyA4d zJUJS{iYbHNiwEoh$T^4tOOb_xGEi`RIP-^p`r4&RvWBqU-zP-A_suPQRagbfeyoGP zgx%=e7omUHJrKd-RVL6r!vnPlP!wD;1wa~g;6H9bDPR`IX16tZ!IJ2qT_|oF@`d?U z>pKAgd;SB{txCT;&wj2P z{}q1Kvvncf4fvAdC}G_;Yd6BGTfYxhH*mgB!XqeZ0Qf*-PA{vWg`M3~bm>Z7F3 zFuG{6isPd9k(G#wYJBp$Z+v6 zr@_u8P}LQ^mfjW+^^Xn|lO2HC|7Hp#{&iR+uhkCDi^$r?WY3*!>e3C*%N=n<*p&^D zj-=yGzr?GLrreS_GY@WxVNQ!PT^SQ^93l~JGk46FjH$;L>;^Ez&J_ta#SUnq1bolA zN+`vt@vgrPNHm`RTWEm^Z@wK3H;J9E040UVaYR~vJ~7KEcfjA1gwC#`jt%{EtxS%~ z84icY^USvKfWWIWtOFcMAJkt_V6vCD?&>Lbq1X}pS0^CYi7PR=4APX&JNJbsvPxZ2 z$fuD~5COb&e`jQD}E^GF8LPjKWR8(e_uO$nm$aih8Wuf6-xYT(H zG7N$pp}9$rUX2%oIUy()qPFe5NIMS8 zupN-NW(S9D-Ww`yOWjLdBi_rjUmwSi-&!^Mw+(x3ev&6JUY<|59O2*-@ov7dvogV~ z56ytphS13^4x*(NLuAGC?QhTFU6sO$7XmepjiTB(jhm19H?w91hl)Tf9;YX|ALJBq zw%I76o&P{Z8hK>jOkJX3SB;w9nFd_X44=$tw^hIV==S&zmkl^>GqPO#b7uk!-d+2#*buqCzueqn z>Fvj69F!7-bv=923y4;7GG3`oQDu&vJ>0BHF~%5^qazQ3^LTSw6erBYoBHm*Z2dhG z6m}i{z1+x|@i&}Jru$F3d+LtRsB&CVLFB+mz|>Iaj7hFxq?>RPAXusJRB6>lDlNhj zkcj`Uc!+daDK|E~G%4m^T(2zt3Z=lxve6s<0n71zeFLj*YTJ;3EJ<|jM$m@oa_xIQ zDM0akTKtgk*n1@F^|uW5R2#&`R1)Pk+Y%f}xiffBa(=rDivUzaXeFNVEuy<*D@xND zMgpYw27W*S$9 z8c8&0^$8J3n-1bzqx9!57Y6Y2V}1~7`Xagl^3%3#(j7I!QxL4aTBxEi&GX{UN#@+P zjs(!tV4)(Ne4PlGt;uZJ(aoxR6j&RY9G)L=14+ifH4f;u1}{(382&Qc8~icuWS}5K zlNpfz_ly1yfx9IoEZZFa7`GUB*qEgJH@7o4aGQ;%BJc9BZM>?ZhDxjyKKmqgASE%h z)hG)}A&@<5b8yi6-*xbRpH2>LcOyimOuM8*Ta4FR{UGl*5c5sCKW*B^V`O^@Bw2R0 Lj`+u?E?)aD4IMoH delta 1837 zcmY+Fdpy(oAIG=vkDvP*!cl(uZfMIj95RM)#}LNO895Qk{kATYTdB4Dup;KRO>znG zE4QCZYNDJrF{IGRC4Q;NjHyJ*!OmHFoIie_zdn!8lZ;RL6?wHkiFt7XGIkBO@@VKt2=rS}E-hZno%PWn1}1u0tBS8R zIwPN>>)RKiJR%=Bp4Kx>;;62Nx zCYPL-1sLQRgJq`$u0XWbsew~G&4Sv(6r@$EeZ6-srQ1+}=3Ck~f)6YM&3XsmK=xRE zxJS?G&-G{M_9kyVA7YW`-D``%^(rWU*kgk9e)myv&oG~sJ%(8u>5f&l=wr!-v>5x6 ztr~E(rHa145L=kW(?2K@Kx@|E2AQ?V z#mTgBDp?c76d4Yb`Knju*R1CBNIP*jpwj7TKY+I{7*fX|M>Q;=OGjsnHm1^ua@{>H znhHDuf;2i%3X4rL=o;99g+1?Aqp_nbmV5-T)TSpZTDrY(-}vjwH1>S3EnlyLRW#&E`%nnS^0>yA2;^w!fA|BkfAu zn2>m1vA{>#L_BUF1g3evDRs_Jh#pNl21a}uc80^$HM?f)o?Pyma%zMI+X@jiQT&$L zyZ=6DxC?mD6m-tUr4L>8y%el5Ow{PVP=oIVpi)*ZH zU%9E%6&Q!b$K~Lr%TsN0R52ovAdDl+hUA3X!7n)S%0{9h8X8-~(b}j^eEvk@D`$Wb zS_2W8yr%WtEL>{uhZR!u6{mnX6pbAVIEEONFTvX>PhSUfnQMDf2Ww_`RV5X z`+}`ZY3vw>Q>S}XK!lYHU6p?OW!&YRwDDCtgqd2J6K*T+SAk^cXe#vel%ocqy%8Xe z#2^^X!*9EkE~c@%WH?#q78#2*gXfTJY7DF1@KIoE^u~##?WeGr{}w$IVHCZnpVUp`&6ev?zk+)^O8w(69q}cK4{>-+ z*x!avHf=lceAdky{!>76RdP&nxd~66mytig1sCI@`7Kqi6j}gRA@Y2@sJgMvcpC>& z1pG~g?JI*sILY*O35z(8deh)sfO|VMSm=gXlHnG_qu!CJv-A3Cco69gMkdpTJ$$Vr zrQYAxSwDjLtn1IUlq@|%5OOBJLf{-^n|!?~L-?LG_pe-?q7e+z#P1t%WY7%K+ruyI zZYYr+ZwzBD1kE_n*r}O50u|C~=07@9uLaTAhB=&S^K<;Gwa8qED8&C!s9O^0?X4z9 zo%`_{jW{=PspX&MDY;uwZ%Ybu2NgqPEnZGPJGh`X+I@`UaFVV5!ZmXDveZlVor2BL z&pTpP$ML&6imJpO$!4utUY&q>X;zFs)?J6aC6~BtC-rmttyQvGSO4|CJt@p&8oQ3Y zQYg538B!JA23^32>z-PUdT#@1ASQdC7=MJ!enxGQ?LHW@1bj;Zw>VO`sBq?Fpss$q~z;R<2Zh1$QRXUbN7 z$dnKB5lrwkhFbs0f++Lmi2R`de>MiWg2VS#LCR*WWYF5jox#C(Q|kuR=qf#}>5ikk zE*n5fpa0+9_g$#cdpzIBbAaaB+do zH!!m^hoq|E(R}jvT=||gSm|D+!`_aYZ-LXXkKusY+_j=!)LpCfxN><*>8QEDDYMe| QHB5TkoV^H*KOMjP7lX4wkN^Mx diff --git a/tests/ref/resvg/text/writing-mode/tb-rl.png b/tests/ref/resvg/text/writing-mode/tb-rl.png index dc144029296167a6c2b972d4639a50550125321e..eda45a92f176611e272065e43af5f66da361d8a8 100644 GIT binary patch literal 1768 zcmZ`)dsvbO7e@j?9R*%sGP74d(w5Bo7hdc2l1W~svmBz7C~8vb%<_geynj?Z+x^n>2>mp|fS{xu&s2)_ODcl-~A5+64!@|zAwH6VjmWOM(Yt$#JmNVVW z<&ud$dHk1e9<*Fa-M^B)Dd|f**0fx<#@e?>cx1OQWKWH=nX9Hc;ptZ8?$8=2hGT?g zpZF6%*flj*;OcuAoopQ?TfvI<@QN(iNLN6a2*M1}?@elVe9%YMK>!)Dcn;o({afrW zX|U5aS!aNrc5dPMl&lm4jle68vX$?9-vu^mCvZxNG8W%E?$VjHAHxy5{I&ScaqqkY znxHLcuGpKaVyyxl$s9%IU54zkUKNq}6*RW(0e|*l`t0gyS9D^}mg(n*f#`T0`FL0)Ie@`i zr1*RZPA?e^tqc`PA)UK4zQu6_GwfHW6cZE=(Oj_|8k^!v*$l@6H$t5{p|LGw{%pqN zMWxT)%9!*7drv1n1&^6>=;2e3`af}h858rCJ7-dhHm?%S=J zfAz+48s_O~Nmnpn{!2_lO!2dgucu=uQOAZA<5wZ~WfW6}ok_FmvakURdS*Km)0^p% z`6&49)Npc$BEHJJr~fz}9(jwk3X{bj(sCHL2{E(12-bJ{)_Th(S|}r97%)xlTt1i| zLDT*2<+aY#9^uVW;M|7?4;$kG7hb$h*{W|S8YBK-kSh&{V67u)zuyNeBhR)w2hiUM zmqia=pBu$ywAPm0e@o^?){uz_R=H;b9qtGNUKDmOUD;>f{6xd@d8r+u)Vivgm^2?P zVcI`2qO=z3S+)FhTGTErX2`5+en{W2$K7T||L2_i*#~L;nMOacIB~p+LR+q|UPyN)-*62TOyhLva;N(!Qh5ST}QsGj`lx zj``=?UpL&`y_oFaO~+uF7LI4lOw!O9`-u|g)B#hG)9X&bshOZ5ZDi}bFSE&w>UMl) zd6i2n z2ELl)(d_nE(#TLF_yLm$8uwJN_F9wA|D;|(DP*yaM5*g6gCu$~NZ(h`JbSg=3%VA% zpPWG1K+NRu|N0U#S0`%+3T~5vxa9y@{=@uS}^S_6K za&-wYC#xG)wf!c{csD_2GEvX|Qk}iv3Y5Ezv2&p|shw030h8gY%i=$=dy@wL5hjbq z{kZtXAX#z&3{hFU6HsQ#o68XO)d{=6B3OvS$2s7ix6#v_h`$2l z%$8hMt6onqmXlgN0rJE$e^y}(FUmeI*%YT9Ryx3;7=;Iv+o z*lq^Syrz9CZWOZU;!7)sT?+;O!N>njoB!nQdvtZEHqup#16u!1!w;3EUI6qDc=rXU oR6yr)J#5ayM}#wU(s{e>P1@xXgFyp5$`1x1AM|z=I|pa}1_Js4n*aa+ literal 2220 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 diff --git a/tests/ref/resvg/text/writing-mode/tb-with-dx-on-second-tspan.png b/tests/ref/resvg/text/writing-mode/tb-with-dx-on-second-tspan.png index 4998b5184a9d0a841b2346b52cdbccee245e5547..32634dd6ba4e88fc5a7494def1aac8d16e54e2fe 100644 GIT binary patch literal 2872 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 diff --git a/tests/ref/resvg/text/writing-mode/tb-with-dx-on-tspan.png b/tests/ref/resvg/text/writing-mode/tb-with-dx-on-tspan.png index 19c6fac433afbfd64b8b374c03e93b77923afd53..974a404d00aa5f4d80186bc96b7479a91a0ec44b 100644 GIT binary patch delta 1522 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 N!<$-S%S|ra_%~Ri!Lk4V diff --git a/tests/ref/resvg/text/writing-mode/tb-with-rotate-and-underline.png b/tests/ref/resvg/text/writing-mode/tb-with-rotate-and-underline.png index b2ac3ac47b16f85585fc5315a1c80b2715ac269f..6c0addd115cd2c7b9e6447f21abe99c6df088377 100644 GIT binary patch delta 2522 zcmV<02_^RF6XX++B!8<(L_t(|+U?zWaFq2O$MJWb-E6iAfh153P>vA{m{P%^2xtdT zQ;BjLpi^2DNEe1fCLo7Um?S_EiVWf~W2ID<`_MvDjLJwUASjo}As{glv97qOLyl=}_xU~3`MjThAb;jHyWi*c{C0nVE@bF(%+&=lIDesEgfp&yMBpFF8D$7W zAW9$tQ34T&5{N*QKm;NXfhd6pL!_f6CXX#K42o*?z9C~zOH%Snr z0!bN%9xj?734#PkMzZn_haSJ1Aqj#6NlN&Z6m3u$BME|(lU!srUV)e(sSE;b$>kDB z0x>~S8Gob}3%ST}EP)sx34(a<<{m2iJfQzAw!=o8uBL@rJ*W2vG0)~@EB3*+dE=F;IId}zP zBL^4TWv4Cy2vBr~GLkNLIdqq0Us24$H#O7e2OyDe7!{-`qVNufZhOsrKcpcCnS%wm zn197BPVuDHA*S}!0qU}Y<+#db#|8?>qmw{P?WsdFn|PO~;Oyv1KDo3Jh^amGNZw-; zeK-@G9Z94UB@k14>Rz(hN<5wM>RFZ(_S7SJpRL5|d+JWvQ;+2U+o>ZEr|hY_$z&_> z0&&Wox{EZfu#z}|nBP+e7b7SnkD1J-mVZFZkpw`>IC5wY+QK!yr=Gg>E{9G7!aPZ@ zw_5Kcz@g)roKO#|*mdg;htA6~UtpA5Hz^@i2bh`4B7wLd$7qTo&$rsc$Ak&QOpkGf zCAfeHrgD`dDSsTYlnA{-OcleQ*+MK$Sj`PSp!u-5(dRkGTlB>(5EDf+fpr`tn|}dB zz{DAkZsT#HSV<->ftbuqPeu=!@ACr|bNHCL0x{W0u5hnACqJPQ%+fWZ@E!lXfBJCI&CDD$dvq;ux$Iw|Mt+Zq4khEjy zoO&?;pr#$e=nI_Ij-g%sn3F-0>UIo^`H+?ZF-;QOF^syz0SfU6#1SNEv+w_!TO4Bq zEd*koB)aiu)@@#)E`2z{JR${RlB5oQvTij$L<9gMxJY+_m?G)P7=PAqt;P1i%K&gO zlOp;E#7>e`gmE`7)40OCi8FkD0D5zd_jI&|$vpfPU)dJ!vlOtOmKy42i=^ZD-}(G> z<0OZ8Sa(^WuP;NWDfh#h8XV^=pYyQRA$F9&KWZjSo-ueCljtK5 zhmZt@x`$c zK?ZP{MLM@Pw2iHq54Y-?|6@T1j%}cKYL0;r43$+fh zvlP6P*NqDlH{Lg36##8G%|YsFsGG~ha4u3>>moyWgpWAFL%PcfbzxZ4)MNFIhm}yu zO>*@?IXfD~8(1~3)KlJOE*}uDb%-6+W=G8=Q#0G{U^C6MFmwpX6KiA6(poEZr;v1x z$$#p7?T6S;GJl0oCQ=O%DHNUJzsed+02X(3Zx=YDv7j z%cZ1MWgu<%oMC#)3UzK))<80pqWf|JGbE0`G8>OT%#pO_CwN&Bb*|@nJj`Ypbu`q? zk;Joyb1Y+5(yG*@q>-hCp;;0Sschs;616ZiN}`3K6Msn>GMN5YS{OQm#7%dK*hhS& zg<(^A;1-CzBt3yf%;5#1?pYYNPN^y3pA0upr8c&Ka5=_*M)3?-M_+)mh$yn)?xC!W=8 zrlCMgk$-?i3Wd#f)hl2u(JUs1NA#9u4@oX@l-HE`EaHd2Bb@SHZhVYLCQv{R%@Dhe z8u#$sn)4NxSx!1pEN*c4SF7kjJ}+Vk#LQ9SUXq#0ZA#cf+W48>vN*y#BD7LBd5CgD z<}seSFyhs^r&vd<9-Y`pGM?&+Z1QRBX&UQUmVaHHssnWjXH98G$&9Lx2t)})AW9$tQ36o{5s3O;AScMs kW&SFYpo@MH4!XMh6Rjq!oSGSX+yDRo07*qoM6N<$f`bN&H2?qr delta 2527 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 delta 2143 zcmV-l2%z_b5rq+uB!5gvL_t(|+U?zIP*mp~$MLVb+hyZ|2#i+-Flrlv+GrJ}tyN;Q zsG-J7v{p-Ob*Ps(iJ96Or#8EdB!d&pXuXW%kPaB}M%5-rG~VhhNwvnNqA?mrj9D~R z3TO-v#HE9ay92|kOlO~yjzZ8x0*OYjiM~Dy$dAVrMCTVyBjSy((zHmqQGy7 zK*Gwwh3K*;cG8mL4LXKCxC9ce26KTAGFNBiwZZ{}NCXm|dU2A9AMc!*-x^1A5`lz` z#8H!S6k7|9P_gU}Z0`aI6G^+PjxWi?)+$GP3b;-lCx00zkT8|GI;xxsR?<4hXH3LK zgg&yuI2exI$w~YiqEl-ey6iP@>m;zflZmY*hXzA4AT%Qha_H8HF_2~?O&q$pXc8nu z@-&+oIduEoEJ%pN&kZK(fXX~bh@_IGxCCMi5E#Hksu&>29p%CKG*MN+I4Bdy1QbynB&==**e`KZOqmFtG@I#yeF%J^O7X0|Ri=PS( zv5tlOl2Hs{5UC7fFm{224J5OG_0-+N@G*}C6jH+H_-P2Pvm^*4Of7gh;R2N`<`gHm zN-0ADu#-p%BYBd^Okf020tru%N$)%An1hpC4u3NVUyuas{DuWMwTFa}gY}Nue*eG* z%%PNI(t{*+=25{bxC9bL4k}ZMXXXRkqsV|JlC=9Ay2=V)ZgR-_>%qNa1RmT1F$LnHn8S2t7%tt*vc_-7ZVnTp=hUqN63tQmO`Jfi z0^(pIZ}P0pL#zSzJK5# zT?AsXSPoP0d?Uyd$~nq|+SE<=2>D5;dYq-AkwcfgmT1nh$O^8rksboEM6;Jil~Y1J z+i5Ql%(rOCcTZEx5jL_}bBOtzy${*yDIf+19?BRl5ThJ;Y$B_%kzzg>MCj$7{Xy^L5?cpS$ed{~J6F z&u4qQ)?NR1kohaJ@~pQeZ+ohs@n28FFB%+m?y8<=Mi*t}S#go{EgB4UVt=R;LxJeT zP$z~0(TU+V=)|z+8On8HXsr{&PgqX0KrC`%*zN|qsp1@c1!9RgB)ymm)U%5TdSD0h zOw9bU+ost5oxQy*R*RU4O})vhE&81ld%x9=G-ovn5VlJ7WV8yhJs5MC&Tcc(Yzj zJkOidG;(MTvBVrQsgOPFCPtIGb>8HVz$&^6#5y40#widBf#|Vlfe1t(UrP{8>Q(}Y zW)s&KEfA}KICz~KOcRJvkg1#LgN;DZ`lDcGOX_u`_embsrf!Y;bARB8zcky_os6NM zK+F`yF5XzQBm{zu7x6JbAZAL&$FXOYhCqnr9SVpLh?#ouG1V!%f*@{+xy|F+Lrmph zIrZPE`N6x`0r)L9S*gL$WU*{$<8O199gN{|d=%1FS6OCr4k~JU3qK9ivV{k9*^BwX zaK;8w*~1bXnnSGe$A5`mV+Ae^hL&hy_JbdiPqZd=Yh>?pu;Udv>eh)>`c-@1xE+LY z;t+_r5-CYMHFE=j+^phnbQFlW`cl^J>ZC#fJoNV4DBK2 za_|@(NRIqZ{6$ftY9n%SfZ;U^tym87dH~42JzU$6mS$#8eJaNo1?@ z_V7JGCw8+ybBM_@sNytp#^?U}bzH3BHQYGqPozN1)QL4z;dj&y+s9lElE5%dk)yAY znk<5Kj+#FICK|~Wp2G&rZ*%v7TTCXFV%{ZDdx)7bspBIyFoxbS zSNa~u#d6LwK!c&Fx{|?u8mMJQ`o@|0WbrBEG^v|yBx{+3-Q#`qZ7wk%n?NklQ>&uN z$st1bvaC^Dr;oaw!>yZ()+ma#4;`DnQIADirLl}#{05?)Q`d_FlOG5hlP?GdNn#Mh zd`SXP0uhK3h(H7)5G4?SD1it>2}B@DAOcYWQ34T&`br>|@oJf0O%kN(2VtR=_CFQQ VFD=87*q{Ia002ovPDHLkV1f%o-P-^F diff --git a/tests/ref/resvg/text/writing-mode/tb.png b/tests/ref/resvg/text/writing-mode/tb.png index dc144029296167a6c2b972d4639a50550125321e..eda45a92f176611e272065e43af5f66da361d8a8 100644 GIT binary patch literal 1768 zcmZ`)dsvbO7e@j?9R*%sGP74d(w5Bo7hdc2l1W~svmBz7C~8vb%<_geynj?Z+x^n>2>mp|fS{xu&s2)_ODcl-~A5+64!@|zAwH6VjmWOM(Yt$#JmNVVW z<&ud$dHk1e9<*Fa-M^B)Dd|f**0fx<#@e?>cx1OQWKWH=nX9Hc;ptZ8?$8=2hGT?g zpZF6%*flj*;OcuAoopQ?TfvI<@QN(iNLN6a2*M1}?@elVe9%YMK>!)Dcn;o({afrW zX|U5aS!aNrc5dPMl&lm4jle68vX$?9-vu^mCvZxNG8W%E?$VjHAHxy5{I&ScaqqkY znxHLcuGpKaVyyxl$s9%IU54zkUKNq}6*RW(0e|*l`t0gyS9D^}mg(n*f#`T0`FL0)Ie@`i zr1*RZPA?e^tqc`PA)UK4zQu6_GwfHW6cZE=(Oj_|8k^!v*$l@6H$t5{p|LGw{%pqN zMWxT)%9!*7drv1n1&^6>=;2e3`af}h858rCJ7-dhHm?%S=J zfAz+48s_O~Nmnpn{!2_lO!2dgucu=uQOAZA<5wZ~WfW6}ok_FmvakURdS*Km)0^p% z`6&49)Npc$BEHJJr~fz}9(jwk3X{bj(sCHL2{E(12-bJ{)_Th(S|}r97%)xlTt1i| zLDT*2<+aY#9^uVW;M|7?4;$kG7hb$h*{W|S8YBK-kSh&{V67u)zuyNeBhR)w2hiUM zmqia=pBu$ywAPm0e@o^?){uz_R=H;b9qtGNUKDmOUD;>f{6xd@d8r+u)Vivgm^2?P zVcI`2qO=z3S+)FhTGTErX2`5+en{W2$K7T||L2_i*#~L;nMOacIB~p+LR+q|UPyN)-*62TOyhLva;N(!Qh5ST}QsGj`lx zj``=?UpL&`y_oFaO~+uF7LI4lOw!O9`-u|g)B#hG)9X&bshOZ5ZDi}bFSE&w>UMl) zd6i2n z2ELl)(d_nE(#TLF_yLm$8uwJN_F9wA|D;|(DP*yaM5*g6gCu$~NZ(h`JbSg=3%VA% zpPWG1K+NRu|N0U#S0`%+3T~5vxa9y@{=@uS}^S_6K za&-wYC#xG)wf!c{csD_2GEvX|Qk}iv3Y5Ezv2&p|shw030h8gY%i=$=dy@wL5hjbq z{kZtXAX#z&3{hFU6HsQ#o68XO)d{=6B3OvS$2s7ix6#v_h`$2l z%$8hMt6onqmXlgN0rJE$e^y}(FUmeI*%YT9Ryx3;7=;Iv+o z*lq^Syrz9CZWOZU;!7)sT?+;O!N>njoB!nQdvtZEHqup#16u!1!w;3EUI6qDc=rXU oR6yr)J#5ayM}#wU(s{e>P1@xXgFyp5$`1x1AM|z=I|pa}1_Js4n*aa+ literal 2220 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 literal 2220 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 literal 2220 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k8A#4*i(A9Mz_cvDC&U%V9R-wxKz)5ZP3SN3r0srBXc3_z`#H|J3AoT-{0TQ&ks`pRuLT?9jxMH z3ra~z5!5RnAV5$JTmcIU3!DvS00WkhkrBd8e}9z|$a+{3gMk0 z$dGXcJA7}cmIKd zhYlY(dhGbgQ>V|KJAdKgrOQ{YUb}wd=B?Xz@7#Ov@X_NZPoF)1`Rdi{H*ep)|M2nC z=PzHsegE;}=da&?{{H{>?|0NMLk0$xE1oWnAr-gY-u)RKk}7ljW92&@<|9Jhj+%`r zdX5I3X^9h~6}+d-^4vK!G9z)KSR!}iq-mnl)}~0Qskq$C3Yz8Tmf;Yr7Np=<^KbIL z=XUNlpIs{H6TN@?``_E2Z`b}UIRDqK-17Rwmm6GQnnm<&0QiqXaKQsm}d?Rq{@*7QY;RCe3t6W4LnAWhtBU3d^|*t{FG(VP5q&=qdZ6 zJo8=~1;@7wrfKaLSj-n<#NEMurEq(FM-ip;_$B6G z%6%d)V0xs}H|7=Tj4RnilQ=V30!}ksVmOt`%K1z5fS%ZdsDQ+<3EB>}$C!e6wXSh} zvRIKLHo@GXcXLBb9hXBq5BG_~3(|hK_gJ&MQa;L5#J$4wpTfFB!VFW7Gf!e#m8EgS zHtk-R{F!f3HVWs$7~URiRKR-A__Z+l7p$AW)vl+Hc>yw$XJZ*FSZk{S+WfkuIpKU&kJc6M-xP4K)i zd4-$S;|neI3_&${uixs{3H^9GHR-fm#e066K$!wYXS0wwm#eC^lGHY=N*y$ozc9y+k_r4ci!cXJ$&Ku-gTUF6tuQ%;ZJ+J zU2@g_2|+J*g|lyL2)JIgu=+1k>9Q&37yMT0y*TynAKwe6>6*sRKl#o0x`zLu>7plF z9KyxCR(F>>mH)^p+Z=W$`aWl1EHCKVsrN%NZU1`SG}f6vZA;F(Xv98} zdtvAIl)3W`$6WpJxo1niXU-^HTV&W6Q_QmKE@xK4%iasM0!Nu9-C^H+S$l3)LE=+} z8+U7dXvOm8e=97Tu>8=}{f|~vINsVc)%BRHY>&eGzQAj~_l~n(+IncEn^wi$3b6@4 zOe!xN<`kMX&+eL-0RM*b8#q}mzh%0aD9#aN;n=kN%*oU8_iPtzb1iN>vTp7BBOImS z`reNiPW~6Hzq_2jswa?dCnw`Gxw{iq#+o%=IUqOTq(OFlX5zOs4|UnMR!lo*xk}NS zA);jJ$k zj44Vhbfg`wOj@*P(dsF#4<$oZ+~E^~7XwH|1dRFTx4=}D`ZMC_YWM`!H&;u6%9)w< XOu>&mImMU`g6jrPS3j3^P6