diff --git a/Cargo.lock b/Cargo.lock index 4e42bf4..2aa9949 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -70,7 +70,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -98,18 +98,18 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "async-trait" -version = "0.1.85" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -215,7 +215,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -230,6 +230,26 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.8.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.98", +] + [[package]] name = "bit-set" version = "0.5.3" @@ -280,9 +300,9 @@ checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" @@ -304,32 +324,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" - -[[package]] -name = "cairo-rs" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae50b5510d86cf96ac2370e66d8dc960882f3df179d6a5a1e52bd94a1416c0f7" -dependencies = [ - "bitflags 2.8.0", - "cairo-sys-rs", - "glib", - "libc", -] - -[[package]] -name = "cairo-sys-rs" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f18b6bb8e43c7eb0f2aac7976afe0c61b6f5fc2ab7bc4c139537ea56c92290df" -dependencies = [ - "glib-sys", - "libc", - "system-deps 7.0.3", -] +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "cassowary" @@ -354,9 +351,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.9" +version = "1.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8293772165d9345bdaaa39b45b2109591e63fe5e6fbc23c6ff930a048aa310b" +checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" dependencies = [ "jobserver", "libc", @@ -364,20 +361,19 @@ dependencies = [ ] [[package]] -name = "cfg-expr" -version = "0.15.8" +name = "cexpr" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" dependencies = [ - "smallvec", - "target-lexicon", + "nom", ] [[package]] name = "cfg-expr" -version = "0.17.2" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d4ba6e40bd1184518716a6e1a781bf9160e286d219ccdb8ab2612e74cfe4789" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" dependencies = [ "smallvec", "target-lexicon", @@ -429,19 +425,30 @@ dependencies = [ ] [[package]] -name = "clap" -version = "4.5.26" +name = "clang-sys" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e77c3243bd94243c03672cb5154667347c457ca271254724f9f393aee1c05ff" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.26" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" dependencies = [ "anstyle", "clap_lex", @@ -507,10 +514,62 @@ dependencies = [ ] [[package]] -name = "cpufeatures" -version = "0.2.16" +name = "core-foundation" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "core-text" +version = "20.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d2790b5c08465d49f8dc05c8bcae9fea467855947db39b0f8145c091aaced5" +dependencies = [ + "core-foundation", + "core-graphics", + "foreign-types", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -635,9 +694,9 @@ dependencies = [ [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-common" @@ -680,7 +739,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -691,7 +750,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -725,7 +784,16 @@ version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" dependencies = [ - "dirs-sys", + "dirs-sys 0.3.7", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys 0.4.1", ] [[package]] @@ -739,6 +807,39 @@ dependencies = [ "winapi", ] +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "dwrote" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70182709525a3632b2ba96b6569225467b18ecb4a77f46d255f713a6bebf05fd" +dependencies = [ + "lazy_static", + "libc", + "winapi", + "wio", +] + [[package]] name = "either" version = "1.13.0" @@ -796,15 +897,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - [[package]] name = "filedescriptor" version = "0.8.2" @@ -850,6 +942,12 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "float-ord" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d" + [[package]] name = "flume" version = "0.11.1" @@ -873,6 +971,69 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" +[[package]] +name = "font-kit" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b64b34f4efd515f905952d91bc185039863705592c0c53ae6d979805dd154520" +dependencies = [ + "bitflags 2.8.0", + "byteorder", + "core-foundation", + "core-graphics", + "core-text", + "dirs 5.0.1", + "dwrote", + "float-ord", + "freetype-sys", + "lazy_static", + "libc", + "log", + "pathfinder_geometry", + "pathfinder_simd", + "walkdir", + "winapi", + "yeslogic-fontconfig-sys", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "freetype-sys" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7edc5b9669349acfda99533e9e0bcf26a51862ab43b08ee7745c55d28eb134" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "fsevent-sys" version = "4.1.0" @@ -912,34 +1073,12 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - [[package]] name = "futures-io" version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - [[package]] name = "futures-sink" version = "0.3.31" @@ -959,12 +1098,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", - "futures-macro", "futures-sink", "futures-task", "pin-project-lite", "pin-utils", - "slab", ] [[package]] @@ -985,7 +1122,19 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", ] [[package]] @@ -995,89 +1144,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] -name = "gio" -version = "0.20.7" +name = "glob" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a517657589a174be9f60c667f1fec8b7ac82ed5db4ebf56cf073a3b5955d8e2e" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-util", - "gio-sys", - "glib", - "libc", - "pin-project-lite", - "smallvec", -] - -[[package]] -name = "gio-sys" -version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8446d9b475730ebef81802c1738d972db42fde1c5a36a627ebc4d665fc87db04" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps 7.0.3", - "windows-sys 0.59.0", -] - -[[package]] -name = "glib" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f969edf089188d821a30cde713b6f9eb08b20c63fc2e584aba2892a7984a8cc0" -dependencies = [ - "bitflags 2.8.0", - "futures-channel", - "futures-core", - "futures-executor", - "futures-task", - "futures-util", - "gio-sys", - "glib-macros", - "glib-sys", - "gobject-sys", - "libc", - "memchr", - "smallvec", -] - -[[package]] -name = "glib-macros" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "715601f8f02e71baef9c1f94a657a9a77c192aea6097cf9ae7e5e177cd8cde68" -dependencies = [ - "heck", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.96", -] - -[[package]] -name = "glib-sys" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b360ff0f90d71de99095f79c526a5888c9c92fc9ee1b19da06c6f5e75f0c2a53" -dependencies = [ - "libc", - "system-deps 7.0.3", -] - -[[package]] -name = "gobject-sys" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a56235e971a63bfd75abb13ef70064e1346388723422a68580d8a6fbac6423" -dependencies = [ - "glib-sys", - "libc", - "system-deps 7.0.3", -] +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "h2" @@ -1091,7 +1161,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.7.0", + "indexmap 2.7.1", "slab", "tokio", "tokio-util", @@ -1192,9 +1262,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "httpdate" @@ -1210,9 +1280,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", @@ -1282,7 +1352,6 @@ dependencies = [ "bytemuck", "byteorder-lite", "num-traits", - "png", "ravif", "rayon", "zune-core", @@ -1307,9 +1376,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -1351,7 +1420,7 @@ dependencies = [ "indoc", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1362,18 +1431,18 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "is-terminal" -version = "0.4.13" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1469,6 +1538,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "libc" version = "0.2.169" @@ -1477,14 +1552,24 @@ checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libfuzzer-sys" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b9569d2f74e257076d8c6bfa73fb505b46b851e51ddaecc825944aa3bed17fa" +checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" dependencies = [ "arbitrary", "cc", ] +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + [[package]] name = "libmimalloc-sys" version = "0.1.39" @@ -1648,7 +1733,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", - "simd-adler32", ] [[package]] @@ -1659,10 +1743,36 @@ checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] +[[package]] +name = "mupdf" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e286545311485e9468840b81b9014f4164ab16b071a53fa755536d52f43b915" +dependencies = [ + "bitflags 2.8.0", + "font-kit", + "mupdf-sys", + "num_enum", + "once_cell", + "serde", + "serde_json", +] + +[[package]] +name = "mupdf-sys" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd2bd5de0f9c7ab0da37de2299626b8449a1263304f8a54def2a93ddfe31ee9b" +dependencies = [ + "bindgen", + "cc", + "pkg-config", +] + [[package]] name = "new_debug_unreachable" version = "1.0.6" @@ -1784,7 +1894,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1816,6 +1926,27 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "num_threads" version = "0.1.7" @@ -1846,6 +1977,12 @@ version = "11.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "ordered-float" version = "4.6.0" @@ -1875,7 +2012,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -1884,6 +2021,25 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pathfinder_geometry" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" +dependencies = [ + "log", + "pathfinder_simd", +] + +[[package]] +name = "pathfinder_simd" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cf07ef4804cfa9aea3b04a7bbdd5a40031dbb6b4f2cbaf2b011666c80c5b4f2" +dependencies = [ + "rustc_version", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -1921,7 +2077,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1975,7 +2131,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1989,22 +2145,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2053,46 +2209,6 @@ dependencies = [ "plotters-backend", ] -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "poppler-rs" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45b1f21ffe55c78cbe3b301950cf15a143c8ff2a0f05a2b9e8e9c80605347206" -dependencies = [ - "cairo-rs", - "gio", - "glib", - "libc", - "poppler-sys-rs", -] - -[[package]] -name = "poppler-sys-rs" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e970afd57f25a79b8e526c257bf9c8cd5a6a68973331b6da341c422a6db47755" -dependencies = [ - "cairo-sys-rs", - "gio-sys", - "glib-sys", - "gobject-sys", - "libc", - "system-deps 7.0.3", -] - [[package]] name = "powerfmt" version = "0.2.0" @@ -2142,7 +2258,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" dependencies = [ "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2165,7 +2281,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2219,7 +2335,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", ] [[package]] @@ -2337,7 +2453,7 @@ dependencies = [ "rand", "rand_chacha", "simd_helpers", - "system-deps 6.2.2", + "system-deps", "thiserror 1.0.69", "v_frame", "wasm-bindgen", @@ -2393,7 +2509,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.15", "libredox", "thiserror 1.0.69", ] @@ -2455,10 +2571,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] -name = "rustix" -version = "0.38.43" +name = "rustc-hash" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.25", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags 2.8.0", "errno", @@ -2475,9 +2606,9 @@ checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "same-file" @@ -2503,6 +2634,12 @@ dependencies = [ "semver-parser", ] +[[package]] +name = "semver" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" + [[package]] name = "semver-parser" version = "0.10.3" @@ -2529,14 +2666,14 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "serde_json" -version = "1.0.135" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ "itoa", "memchr", @@ -2609,12 +2746,6 @@ dependencies = [ "libc", ] -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - [[package]] name = "simd_helpers" version = "0.1.0" @@ -2707,7 +2838,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2723,9 +2854,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.96" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -2744,20 +2875,7 @@ version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" dependencies = [ - "cfg-expr 0.15.8", - "heck", - "pkg-config", - "toml", - "version-compare", -] - -[[package]] -name = "system-deps" -version = "7.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d23aaf9f331227789a99e8de4c91bf46703add012bdfd45fdecdfb2975a005" -dependencies = [ - "cfg-expr 0.17.2", + "cfg-expr", "heck", "pkg-config", "toml", @@ -2774,20 +2892,18 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" name = "tdf-viewer" version = "0.2.0" dependencies = [ - "cairo-rs", "console-subscriber", "cpuprofiler", "criterion", "crossterm", "flume", "futures-util", - "glib", "image", "itertools 0.14.0", "mimalloc", + "mupdf", "nix 0.29.0", "notify", - "poppler-rs", "ratatui", "ratatui-image", "tokio", @@ -2796,13 +2912,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.15.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" +checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" dependencies = [ "cfg-if", "fastrand", - "getrandom", + "getrandom 0.3.1", "once_cell", "rustix", "windows-sys 0.59.0", @@ -2814,7 +2930,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "666cd3a6681775d22b200409aad3b089c5b99fb11ecdd8a204d9d62f8148498f" dependencies = [ - "dirs", + "dirs 4.0.0", "fnv", "nom", "phf", @@ -2855,7 +2971,7 @@ dependencies = [ "pest", "pest_derive", "phf", - "semver", + "semver 0.11.0", "sha2", "signal-hook", "siphasher 0.3.11", @@ -2900,7 +3016,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2911,7 +3027,7 @@ checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2980,7 +3096,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3009,9 +3125,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ "serde", "serde_spanned", @@ -3030,11 +3146,11 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.22.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.7.1", "serde", "serde_spanned", "toml_datetime", @@ -3136,7 +3252,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3184,9 +3300,9 @@ checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "unicode-segmentation" @@ -3219,12 +3335,12 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.12.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744018581f9a3454a9e15beb8a33b017183f1e7c0cd170232a2d1453b23a51c4" +checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" dependencies = [ "atomic", - "getrandom", + "getrandom 0.3.1", ] [[package]] @@ -3240,9 +3356,9 @@ dependencies = [ [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vb64" @@ -3295,6 +3411,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -3317,7 +3442,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "wasm-bindgen-shared", ] @@ -3339,7 +3464,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3379,7 +3504,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e5a5e0adf7eed68976410def849a4bdab6f6e9f6163f152de9cb89deea9e60b" dependencies = [ - "getrandom", + "getrandom 0.2.15", "mac_address", "once_cell", "sha2", @@ -3473,7 +3598,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ "windows-core", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3486,7 +3611,7 @@ dependencies = [ "windows-interface", "windows-result", "windows-strings", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3497,7 +3622,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3508,7 +3633,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3517,7 +3642,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3527,7 +3652,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ "windows-result", - "windows-targets", + "windows-targets 0.52.6", +] + +[[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", ] [[package]] @@ -3536,7 +3670,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3545,7 +3679,22 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +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]] @@ -3554,28 +3703,46 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] +[[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.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -3588,24 +3755,48 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -3614,13 +3805,31 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.24" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" +checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" dependencies = [ "memchr", ] +[[package]] +name = "wio" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" +dependencies = [ + "winapi", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.8.0", +] + [[package]] name = "xflags" version = "0.4.0-pre.2" @@ -3636,6 +3845,17 @@ version = "0.4.0-pre.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a6d9b56f406f5754a3808524166b6e6bdfe219c0526e490cfc39ecc0582a4e6" +[[package]] +name = "yeslogic-fontconfig-sys" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503a066b4c037c440169d995b869046827dbc71263f6e8f3be6d77d4f3229dbd" +dependencies = [ + "dlib", + "once_cell", + "pkg-config", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -3654,7 +3874,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index a7a72d6..3db9e51 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,8 +21,8 @@ path = "src/main.rs" name = "tdf" [dependencies] -poppler-rs = { version = "0.24.1", default-features = false, features = ["v23_7"] } -cairo-rs = { version = "0.20.0", default-features = false, features = ["png"] } +# poppler-rs = { version = "0.24.1", default-features = false, features = ["v23_7"] } +# cairo-rs = { version = "0.20.0", default-features = false, features = ["png"] } # we're using this branch because it has significant performance fixes that I'm waiting on responses from the upstream devs to get upstreamed. See https://github.com/ratatui-org/ratatui/issues/1116 ratatui = { git = "https://github.com/itsjunetime/ratatui.git" } # ratatui = { path = "./ratatui/ratatui" } @@ -30,16 +30,17 @@ ratatui = { git = "https://github.com/itsjunetime/ratatui.git" } ratatui-image = { git = "https://github.com/itsjunetime/ratatui-image.git", branch = "vb64_on_personal", default-features = false } # ratatui-image = { path = "./ratatui-image", features = ["vb64"], default-features = false } crossterm = { version = "0.28.1", features = ["event-stream"] } -image = { version = "0.25.1", features = ["png", "rayon"], default-features = false } +image = { version = "0.25.1", features = ["pnm", "bmp", "rayon"], default-features = false } notify = { version = "8.0.0", features = ["crossbeam-channel"] } tokio = { version = "1.37.0", features = ["rt-multi-thread", "macros"] } futures-util = { version = "0.3.30", default-features = false } -glib = "0.20.0" +# glib = "0.20.0" itertools = "*" flume = { version = "0.11.0", default-features = false, features = ["async"] } xflags = "0.4.0-pre.2" mimalloc = "0.1.43" nix = { version = "0.29.0", features = ["signal"] } +mupdf = "0.4.4" # for tracing with tokio-console console-subscriber = { version = "0.4.0", optional = true } diff --git a/benches/rendering.rs b/benches/rendering.rs index d7e6930..d6b94e2 100644 --- a/benches/rendering.rs +++ b/benches/rendering.rs @@ -97,7 +97,7 @@ async fn render_all_files(path: &'static str) -> Vec { RenderInfo::Reloaded => (), RenderInfo::NumPages(num) => fill_default(&mut pages, num), RenderInfo::Page(page) => { - let num = page.page; + let num = page.page_num; pages[num] = Some(page); } }; diff --git a/benches/utils.rs b/benches/utils.rs index 98474d4..384e160 100644 --- a/benches/utils.rs +++ b/benches/utils.rs @@ -63,7 +63,7 @@ pub fn start_rendering_loop( Sender ) { let pathbuf = path.as_ref().canonicalize().unwrap(); - let str_path = format!("file://{}", pathbuf.into_os_string().to_string_lossy()); + let str_path = pathbuf.into_os_string().to_string_lossy().to_string(); let (to_render_tx, from_main_rx) = unbounded(); let (to_main_tx, from_render_rx) = unbounded(); diff --git a/src/converter.rs b/src/converter.rs index 296f50f..b302eb4 100644 --- a/src/converter.rs +++ b/src/converter.rs @@ -1,6 +1,5 @@ use flume::{Receiver, SendError, Sender, TryRecvError}; use futures_util::stream::StreamExt; -use image::ImageFormat; use itertools::Itertools; use ratatui_image::{picker::Picker, protocol::Protocol, Resize}; @@ -54,22 +53,22 @@ pub async fn run_conversion_loop( return Ok(None); }; - let img_area = page_info.img_data.area; + let dyn_img = image::load_from_memory_with_format( + &page_info.img_data.pixels, + image::ImageFormat::Pnm + ) + .map_err(|e| RenderError::Converting(format!("Can't load image: {e}")))?; - let dyn_img = - image::load_from_memory_with_format(&page_info.img_data.data, ImageFormat::Png) - .map_err(|e| { - RenderError::Render(format!("Couldn't convert Vec to DynamicImage: {e}")) - })?; + let img_area = page_info.img_data.cell_area; // We don't actually want to Crop this image, but we've already // verified (with the ImageSurface stuff) that the image is the correct // size for the area given, so to save ratatui the work of having to // resize it, we tell them to crop it to fit. let txt_img = picker - .new_protocol(dyn_img, img_area, Resize::None) + .new_protocol(dyn_img, img_area, Resize::Scale(None)) .map_err(|e| { - RenderError::Render(format!( + RenderError::Converting(format!( "Couldn't convert DynamicImage to ratatui image: {e}" )) })?; @@ -79,7 +78,7 @@ pub async fn run_conversion_loop( Ok(Some(ConvertedPage { page: txt_img, - num: page_info.page, + num: page_info.page_num, num_results: page_info.search_results })) } @@ -87,7 +86,7 @@ pub async fn run_conversion_loop( fn handle_notif(msg: ConverterMsg, images: &mut Vec>, page: &mut usize) { match msg { ConverterMsg::AddImg(img) => { - let page_num = img.page; + let page_num = img.page_num; images[page_num] = Some(img); } ConverterMsg::NumPages(n_pages) => { diff --git a/src/main.rs b/src/main.rs index 174642a..d364802 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,7 +13,7 @@ use crossterm::{ } }; use futures_util::{stream::StreamExt, FutureExt}; -use glib::{LogField, LogLevel, LogWriterOutput}; +// use glib::{LogField, LogLevel, LogWriterOutput}; use notify::{Event, EventKind, RecursiveMode, Watcher}; use ratatui::{backend::CrosstermBackend, Terminal}; use ratatui_image::picker::Picker; @@ -81,7 +81,7 @@ async fn main() -> Result<(), Box> { // TODO: Handle non-utf8 file names? Maybe by constructing a CString and passing that in to the // poppler stuff instead of a rust string? - let file_path = format!("file://{}", path.clone().into_os_string().to_string_lossy()); + let file_path = path.clone().into_os_string().to_string_lossy().to_string(); let mut window_size = window_size()?; @@ -164,7 +164,7 @@ async fn main() -> Result<(), Box> { // poppler has some annoying logging (e.g. if you request a page index out-of-bounds of a // document's pages, then it will return `None`, but still log to stderr with CRITICAL level), // so we want to just ignore all logging since this is a tui app. - glib::log_set_writer_func(noop); + // glib::log_set_writer_func(noop); execute!( term.backend_mut(), @@ -208,7 +208,7 @@ async fn main() -> Result<(), Box> { to_converter.send(ConverterMsg::NumPages(num))?; }, RenderInfo::Page(info) => { - tui.got_num_results_on_page(info.page, info.search_results); + tui.got_num_results_on_page(info.page_num, info.search_results); to_converter.send(ConverterMsg::AddImg(info))?; }, RenderInfo::Reloaded => tui.set_msg(MessageSetting::Some(BottomMessage::Reloaded)), @@ -275,7 +275,7 @@ fn on_notify_ev( match ev.kind { EventKind::Access(_) => (), EventKind::Remove(_) => to_tui_tx - .send(Err(RenderError::Render("File was deleted".into()))) + .send(Err(RenderError::Converting("File was deleted".into()))) .unwrap(), // This shouldn't fail to send unless the receiver gets disconnected. If that's // happened, then like the main thread has panicked or something, so it doesn't matter @@ -287,6 +287,6 @@ fn on_notify_ev( } } -fn noop(_: LogLevel, _: &[LogField<'_>]) -> LogWriterOutput { +/*fn noop(_: LogLevel, _: &[LogField<'_>]) -> LogWriterOutput { LogWriterOutput::Handled -} +}*/ diff --git a/src/renderer.rs b/src/renderer.rs index 5c39227..e593b31 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -1,10 +1,9 @@ -use std::thread; +use std::{thread::sleep, time::Duration}; -use cairo::{Antialias, Context, Format, Surface}; use crossterm::terminal::WindowSize; use flume::{Receiver, SendError, Sender, TryRecvError}; use itertools::Itertools; -use poppler::{Color, Document, FindFlags, Page, Rectangle, SelectionStyle}; +use mupdf::{Colorspace, Document, Matrix, Page, Pixmap, TextPageOptions}; use ratatui::layout::Rect; pub enum RenderNotif { @@ -17,10 +16,8 @@ pub enum RenderNotif { #[derive(Debug)] pub enum RenderError { Notify(notify::Error), - Doc(glib::Error), - // Don't like storing an error as a string but it needs to be Send to send to the main thread, - // and it's just going to be shown to the user, so whatever - Render(String) + Doc(mupdf::error::Error), + Converting(String) } pub enum RenderInfo { @@ -32,14 +29,14 @@ pub enum RenderInfo { #[derive(Clone)] pub struct PageInfo { pub img_data: ImageData, - pub page: usize, + pub page_num: usize, pub search_results: usize } #[derive(Clone)] pub struct ImageData { - pub data: Vec, - pub area: Rect + pub pixels: Vec, + pub cell_area: Rect } #[derive(Default)] @@ -71,7 +68,7 @@ pub fn fill_default(vec: &mut Vec, size: usize) { #[allow(clippy::needless_pass_by_value)] pub fn start_rendering( path: &str, - mut sender: Sender>, + sender: Sender>, receiver: Receiver, size: WindowSize ) -> Result<(), SendError>> { @@ -95,7 +92,7 @@ pub fn start_rendering( let mut stored_doc = None; 'reload: loop { - let doc = match Document::from_file(path, None) { + let doc = match Document::open(path) { Err(e) => { // if there's an error, tell the main loop sender.send(Err(RenderError::Doc(e)))?; @@ -125,7 +122,17 @@ pub fn start_rendering( } }; - let n_pages = doc.n_pages() as usize; + //let n_pages = doc.page_count() as usize; + let n_pages = match doc.page_count() { + Ok(n) => n as usize, + Err(e) => { + sender.send(Err(RenderError::Doc(e)))?; + // just basic backoff i think + sleep(Duration::from_secs(1)); + continue 'reload; + } + }; + sender.send(Ok(RenderInfo::NumPages(n_pages)))?; // We're using this vec of bools to indicate which page numbers have already been rendered, @@ -205,8 +212,8 @@ pub fn start_rendering( .map(|(idx, p)| (start_point - (idx + 1), p)) ); - let area_w = f64::from(area.width) * f64::from(col_w); - let area_h = f64::from(area.height) * f64::from(col_h); + let area_w = f32::from(area.width) * f32::from(col_w); + let area_h = f32::from(area.height) * f32::from(col_h); // we go through each page for (num, rendered) in page_iter { @@ -230,12 +237,12 @@ pub fn start_rendering( // We know this is in range 'cause we're iterating over it but we still just want // to be safe - let Some(page) = doc.page(num as i32) else { - sender.send(Err(RenderError::Render(format!( - "Couldn't get page {num} ({}) of doc?", - num as i32 - ))))?; - continue; + let page = match doc.load_page(num as i32) { + Err(e) => { + sender.send(Err(RenderError::Doc(e)))?; + continue; + } + Ok(p) => p }; let rendered_with_no_results = @@ -260,23 +267,31 @@ pub fn start_rendering( rendered.contained_term = Some(ctx.num_results > 0); rendered.successful = true; - // if this is the page that the user is currently trying to look at, don't - // bother spawning off a thread to render it to a png - it'll only slow - // down the time til the user can see it (due to the overhead of creating a - // thread), but we still want to spawn threads to render the other pages - // since the effects of parallelizing that will be noticeable if the user - // tries to move through pages more quickly - if num == start_point { - render_ctx_to_png(&ctx, &mut sender, (col_w, col_h), num)?; - } else { - let mut sender = sender.clone(); - thread::spawn(move || { - render_ctx_to_png(&ctx, &mut sender, (col_w, col_h), num) - }); - } + let cap = (ctx.pixmap.width() + * ctx.pixmap.height() * u32::from(ctx.pixmap.n())) + as usize; + let mut pixels = Vec::with_capacity(cap); + if let Err(e) = ctx.pixmap.write_to(&mut pixels, mupdf::ImageFormat::PAM) { + sender.send(Err(RenderError::Doc(e)))?; + continue; + }; + + sender.send(Ok(RenderInfo::Page(PageInfo { + img_data: ImageData { + pixels, + cell_area: Rect { + x: 0, + y: 0, + width: (ctx.surface_w / f32::from(col_w)) as u16, + height: (ctx.surface_h / f32::from(col_h)) as u16 + } + }, + page_num: num, + search_results: ctx.num_results + })))?; } // And if we got an error, then obviously we need to propagate that - Err(e) => sender.send(Err(RenderError::Render(e)))? + Err(e) => sender.send(Err(RenderError::Doc(e)))? } } @@ -295,10 +310,10 @@ pub fn start_rendering( } struct RenderedContext { - surface: Surface, - num_results: usize, - surface_width: f64, - surface_height: f64 + pixmap: Pixmap, + surface_w: f32, + surface_h: f32, + num_results: usize } /// SAFETY: I think this is safe because, although the backing struct for `Surface` does contain @@ -317,11 +332,15 @@ fn render_single_page_to_ctx( page: &Page, search_term: Option<&str>, already_rendered_no_results: bool, - (area_w, area_h): (f64, f64) -) -> Result, String> { - let mut result_rects = search_term + (area_w, area_h): (f32, f32) +) -> Result, mupdf::error::Error> { + let result_rects = search_term .as_ref() - .map(|term| page.find_text_with_options(term, FindFlags::DEFAULT | FindFlags::MULTILINE)) + .map(|term| { + page.to_text_page(TextPageOptions::all())? + .search(term, u32::MAX) + }) + .transpose()? .unwrap_or_default(); // If there are no search terms on this page, and we've already rendered it with no search @@ -331,7 +350,11 @@ fn render_single_page_to_ctx( } // then, get the size of the page - let (p_width, p_height) = page.size(); + let bounds = page.bounds()?; + let (p_width, p_height) = ( + f32::from(bounds.x1 - bounds.x0), + f32::from(bounds.y1 - bounds.y0) + ); // and get its aspect ratio let p_aspect_ratio = p_width / p_height; @@ -353,39 +376,22 @@ fn render_single_page_to_ctx( area_h / p_height }; - let surface_width = p_width * scale_factor; - let surface_height = p_height * scale_factor; + let surface_w = p_width * scale_factor; + let surface_h = p_height * scale_factor; - let surface = cairo::ImageSurface::create( - Format::Rgb16_565, - // No matter how big you make these arguments, the image will be drawn at the same - // size. So if you make them really big, the image will be drawn on a quarter of it. If - // you make them really small, the image will cover more than all of the surface. - // - // However, that only stands as long as you don't scale the context that you place this - // surface into. If you scale the dimensions of this image by n, then scale the context - // by that same amount, then it'll still fit perfectly into the context, but be - // rendered at higher quality. - surface_width as i32, - surface_height as i32 - ) - .map_err(|e| format!("Couldn't create ImageSurface: {e}"))?; - surface.set_device_scale(scale_factor, scale_factor); + let colorspace = Colorspace::device_rgb(); + let matrix = Matrix::new_scale(scale_factor, scale_factor); - let ctx = Context::new(surface).map_err(|e| format!("Couldn't create Context: {e}"))?; + let mut pixmap = page.to_pixmap(&matrix, &colorspace, 0.0, false)?; - // The default background color of PDFs (at least, I think) is white, so we need to set - // that as the background color, then paint, then render. - ctx.set_source_rgba(1.0, 1.0, 1.0, 1.0); - - ctx.set_antialias(Antialias::None); - ctx.paint() - .map_err(|e| format!("Couldn't paint Context: {e}"))?; - page.render(&ctx); + let (x_res, y_res) = pixmap.resolution(); + let new_x = (x_res as f32 * scale_factor) as i32; + let new_y = (y_res as f32 * scale_factor) as i32; + pixmap.set_resolution(new_x, new_y); let num_results = result_rects.len(); - if !result_rects.is_empty() { + /*if !result_rects.is_empty() { let mut highlight_color = Color::new(); highlight_color.set_red((u16::MAX / 5) * 4); highlight_color.set_green((u16::MAX / 5) * 4); @@ -406,40 +412,12 @@ fn render_single_page_to_ctx( &mut highlight_color ); } - } + }*/ Ok(Some(RenderedContext { - surface: ctx.target(), - num_results, - surface_width, - surface_height + pixmap, + surface_w, + surface_h, + num_results })) } - -fn render_ctx_to_png( - ctx: &RenderedContext, - sender: &mut Sender>, - (col_w, col_h): (u16, u16), - page: usize -) -> Result<(), SendError>> { - let mut img_data = Vec::with_capacity((ctx.surface_height * ctx.surface_width) as usize); - - match ctx.surface.write_to_png(&mut img_data) { - Err(e) => sender.send(Err(RenderError::Render(format!( - "Couldn't write surface to png: {e}" - )))), - Ok(()) => sender.send(Ok(RenderInfo::Page(PageInfo { - img_data: ImageData { - data: img_data, - area: Rect { - width: ctx.surface_width as u16 / col_w, - height: ctx.surface_height as u16 / col_h, - x: 0, - y: 0 - } - }, - page, - search_results: ctx.num_results - }))) - } -} diff --git a/src/tui.rs b/src/tui.rs index 4e45df8..02c640b 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -570,7 +570,7 @@ impl Tui { self.set_msg(MessageSetting::Some(BottomMessage::Error(match err { RenderError::Notify(e) => format!("Auto-reload failed: {e}"), RenderError::Doc(e) => format!("Couldn't open document: {e}"), - RenderError::Render(e) => format!("Couldn't render page: {e}") + RenderError::Converting(e) => format!("Couldn't convert page after rendering: {e}") }))); }