diff --git a/Cargo.lock b/Cargo.lock index 099b9cf..5450cb4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -264,24 +264,6 @@ dependencies = [ "vsimd", ] -[[package]] -name = "bindgen" -version = "0.72.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" -dependencies = [ - "bitflags 2.11.1", - "cexpr", - "clang-sys", - "itertools 0.13.0", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn", -] - [[package]] name = "bit_field" version = "0.10.3" @@ -404,15 +386,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom 7.1.3", -] - [[package]] name = "cfg-if" version = "1.0.4" @@ -463,17 +436,6 @@ dependencies = [ "half", ] -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - [[package]] name = "clap" version = "4.6.1" @@ -499,6 +461,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +[[package]] +name = "color" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ec7c5eb7a16992b1904d76c517d170ab353b0e0b3d5a0c81a8a0cd1037893cf" +dependencies = [ + "bytemuck", +] + [[package]] name = "compact_str" version = "0.9.0" @@ -562,58 +533,12 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -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 = "cpuprofiler" version = "0.0.4" @@ -818,36 +743,6 @@ dependencies = [ "syn", ] -[[package]] -name = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.61.2", -] - -[[package]] -name = "dlib" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" -dependencies = [ - "libloading", -] - [[package]] name = "document-features" version = "0.2.12" @@ -857,18 +752,6 @@ dependencies = [ "litrs", ] -[[package]] -name = "dwrote" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b35532432acc8b19ceed096e35dfa088d3ea037fe4f3c085f1f97f33b4d02" -dependencies = [ - "lazy_static", - "libc", - "winapi", - "wio", -] - [[package]] name = "either" version = "1.15.0" @@ -921,6 +804,15 @@ dependencies = [ "version_check", ] +[[package]] +name = "euclid" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" +dependencies = [ + "num-traits", +] + [[package]] name = "exr" version = "1.74.0" @@ -942,6 +834,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" +[[package]] +name = "fastrand" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + [[package]] name = "fdeflate" version = "0.3.7" @@ -951,6 +849,12 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "fearless_simd" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97b65636e5b9ef369943878ac74335ba1c55c1cb6adbf1e2c293c624248d693" + [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -986,12 +890,6 @@ dependencies = [ "thiserror", ] -[[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.12.0" @@ -1016,66 +914,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] -name = "font-kit" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7e611d49285d4c4b2e1727b72cf05353558885cc5252f93707b845dfcaf3d3" -dependencies = [ - "bitflags 2.11.1", - "byteorder", - "core-foundation", - "core-graphics", - "core-text", - "dirs", - "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", -] - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" +name = "font-types" +version = "0.11.3" 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" +checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7" dependencies = [ - "cc", - "libc", - "pkg-config", + "bytemuck", ] [[package]] @@ -1132,17 +976,6 @@ dependencies = [ "slab", ] -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - [[package]] name = "getrandom" version = "0.3.4" @@ -1162,10 +995,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] -name = "glob" -version = "0.3.3" +name = "glifo" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d99fc21d493812643aae86d53b7bbd02f376434a90317e8a790bc209fdd6605e" +dependencies = [ + "bytemuck", + "foldhash", + "hashbrown 0.17.1", + "log", + "peniko", + "png", + "skrifa", + "smallvec", + "vello_common 0.0.9", +] + +[[package]] +name = "guillotiere" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "6b17e70c989c36bad147b27a58d148c0741c51448aa5653436547323e524d0ab" +dependencies = [ + "euclid", +] [[package]] name = "h2" @@ -1210,9 +1063,101 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.17.0" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hayro" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4caa128ab87fd48ffb7490617cf93f77f606820dffbc9fd9ef6ab0ed077f56d" +dependencies = [ + "bytemuck", + "hayro-interpret", + "image", + "kurbo", + "pic-scale", + "vello_cpu", +] + +[[package]] +name = "hayro-ccitt" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f4d0e94ddd48749f06bbe4e5389fb9799a0c45bcaf00495042076ef05e3241a" + +[[package]] +name = "hayro-cmap" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" +checksum = "24d285dc30731c8485de5fa732fbdf2b3affdf01e4da7c2135022ca6fa664bf6" +dependencies = [ + "hayro-postscript", +] + +[[package]] +name = "hayro-interpret" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2613d0406898995042d0794c4245b2f2fba1246490c8ac593769bba6551129d" +dependencies = [ + "bitflags 2.11.1", + "hayro-cmap", + "hayro-syntax", + "kurbo", + "moxcms", + "phf", + "rustc-hash", + "siphasher", + "skrifa", + "smallvec", + "yoke", +] + +[[package]] +name = "hayro-jbig2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69374b3668dd45aeb3d3145cda68f2c7b4f223aaa2511e67d076f1c7d741388d" +dependencies = [ + "fearless_simd", + "hayro-ccitt", +] + +[[package]] +name = "hayro-jpeg2000" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ab947623ef4ccaa7acf0579edf7cbb5a73838e3839a7be73335e522f433a1" +dependencies = [ + "fearless_simd", +] + +[[package]] +name = "hayro-postscript" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "885c5ef0654933139a9b9546fc2c69e18d37f38aa2520f079092b1be18f1fcaa" + +[[package]] +name = "hayro-syntax" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0edeafd70aa2db743de8ede8637d07ec87db05efe69cde371d03f1b185fcef27" +dependencies = [ + "flate2", + "hayro-ccitt", + "hayro-jbig2", + "hayro-jpeg2000", + "memchr", + "rustc-hash", + "smallvec", + "zune-jpeg", +] [[package]] name = "hdrhistogram" @@ -1408,7 +1353,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.17.0", + "hashbrown 0.17.1", ] [[package]] @@ -1494,7 +1439,7 @@ version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.4", + "getrandom", "libc", ] @@ -1559,6 +1504,18 @@ dependencies = [ "libc", ] +[[package]] +name = "kurbo" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b60dfc32f652b926df6192e55525b16d186c69d47876c3ead4da5cc9f8450e2" +dependencies = [ + "arrayvec", + "euclid", + "polycool", + "smallvec", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -1587,16 +1544,6 @@ dependencies = [ "cc", ] -[[package]] -name = "libloading" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" -dependencies = [ - "cfg-if", - "windows-link 0.2.1", -] - [[package]] name = "libm" version = "0.2.16" @@ -1612,15 +1559,6 @@ dependencies = [ "cc", ] -[[package]] -name = "libredox" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" -dependencies = [ - "libc", -] - [[package]] name = "line-clipping" version = "0.3.7" @@ -1630,6 +1568,12 @@ dependencies = [ "bitflags 2.11.1", ] +[[package]] +name = "linebender_resource_handle" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" + [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -1777,30 +1721,6 @@ dependencies = [ "pxfm", ] -[[package]] -name = "mupdf" -version = "0.6.0" -source = "git+https://github.com/messense/mupdf-rs.git?rev=d7441b9998c92135e329559c0aa71d9dc92cf4de#d7441b9998c92135e329559c0aa71d9dc92cf4de" -dependencies = [ - "bitflags 2.11.1", - "font-kit", - "mupdf-sys", - "once_cell", - "zerocopy", -] - -[[package]] -name = "mupdf-sys" -version = "0.6.0" -source = "git+https://github.com/messense/mupdf-rs.git?rev=d7441b9998c92135e329559c0aa71d9dc92cf4de#d7441b9998c92135e329559c0aa71d9dc92cf4de" -dependencies = [ - "bindgen", - "cc", - "pkg-config", - "regex", - "zerocopy", -] - [[package]] name = "new_debug_unreachable" version = "1.0.6" @@ -1977,12 +1897,6 @@ version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" -[[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 = "5.3.0" @@ -2068,28 +1982,75 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" [[package]] -name = "pathfinder_geometry" -version = "0.5.1" +name = "peniko" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" +checksum = "839c8299360d2e998bdb106dc0a6cd71dcc5f4df51df1b620361bf50e283cca6" dependencies = [ - "log", - "pathfinder_simd", + "bytemuck", + "color", + "kurbo", + "linebender_resource_handle", + "smallvec", ] [[package]] -name = "pathfinder_simd" -version = "0.5.5" -source = "git+https://github.com/itsjunetime/pathfinder.git?rev=814671e162a1829e074521446317b915311d3d4d#814671e162a1829e074521446317b915311d3d4d" +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ - "rustc_version", + "phf_macros", + "phf_shared", ] [[package]] -name = "percent-encoding" -version = "2.3.2" +name = "phf_generator" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pic-scale" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b05a62c3762cb26cb62665b915fea652def8a9f609b0b289b7f782a7394307b" +dependencies = [ + "num-traits", + "pxfm", +] [[package]] name = "pin-project" @@ -2164,6 +2125,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "polycool" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50596ddc09eb5ad5f75cacd40209568e66df71baf86e1499a0e99c4cff12a5a6" +dependencies = [ + "arrayvec", +] + [[package]] name = "portable-atomic" version = "1.13.1" @@ -2334,7 +2304,7 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ - "getrandom 0.3.4", + "getrandom", ] [[package]] @@ -2490,23 +2460,22 @@ dependencies = [ ] [[package]] -name = "redox_syscall" -version = "0.5.18" +name = "read-fonts" +version = "0.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +checksum = "c4ed38b89c2c77ff968c524145ad65fb010f38af5c7a224b53b81d47ac2daa81" dependencies = [ - "bitflags 2.11.1", + "bytemuck", + "font-types", ] [[package]] -name = "redox_users" -version = "0.5.2" +name = "redox_syscall" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror", + "bitflags 2.11.1", ] [[package]] @@ -2744,6 +2713,22 @@ dependencies = [ "quote", ] +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "skrifa" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c34617370ae968efb7161bb2beb517d9084659aae19e24b89e3db25b46e4564" +dependencies = [ + "bytemuck", + "read-fonts", +] + [[package]] name = "slab" version = "0.4.12" @@ -2831,6 +2816,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tap" version = "1.0.1" @@ -2841,6 +2837,7 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" name = "tdf-viewer" version = "0.5.0" dependencies = [ + "color", "console-subscriber", "cpuprofiler", "criterion", @@ -2850,12 +2847,12 @@ dependencies = [ "flexi_logger", "flume", "futures-util", + "hayro", "image", "kittage", "log", "memmap2", "mimalloc", - "mupdf", "nix", "notify", "ratatui", @@ -3147,6 +3144,53 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +[[package]] +name = "vello_common" +version = "0.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3361bff7f7d82c0c496b92048db83846691f0e844cc28dee92b1c824291b55ee" +dependencies = [ + "bytemuck", + "fearless_simd", + "guillotiere", + "hashbrown 0.17.1", + "log", + "peniko", + "png", + "smallvec", + "thiserror", +] + +[[package]] +name = "vello_common" +version = "0.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d672facaa2d697285a786cd9d44d614cd2ce54cdc022504bf339f8fff3b750" +dependencies = [ + "bytemuck", + "fearless_simd", + "guillotiere", + "hashbrown 0.17.1", + "log", + "peniko", + "png", + "smallvec", + "thiserror", +] + +[[package]] +name = "vello_cpu" +version = "0.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d8ded630e8316bb94a55881256506d1f3b9947b5f66db8a7d32ca7ba02decd0" +dependencies = [ + "bytemuck", + "glifo", + "hashbrown 0.17.1", + "png", + "vello_common 0.0.8", +] + [[package]] name = "version_check" version = "0.9.5" @@ -3538,15 +3582,6 @@ dependencies = [ "windows-ext", ] -[[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" version = "0.57.1" @@ -3584,14 +3619,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" [[package]] -name = "yeslogic-fontconfig-sys" -version = "6.0.0" +name = "yoke" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503a066b4c037c440169d995b869046827dbc71263f6e8f3be6d77d4f3229dbd" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ - "dlib", - "once_cell", - "pkg-config", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", ] [[package]] @@ -3614,12 +3661,39 @@ dependencies = [ "syn", ] +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +[[package]] +name = "zune-core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" + [[package]] name = "zune-inflate" version = "0.2.54" @@ -3628,3 +3702,17 @@ checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" dependencies = [ "simd-adler32", ] + +[[package]] +name = "zune-jpeg" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" +dependencies = [ + "zune-core", +] + +[[patch.unused]] +name = "pathfinder_simd" +version = "0.5.5" +source = "git+https://github.com/itsjunetime/pathfinder.git?rev=814671e162a1829e074521446317b915311d3d4d#814671e162a1829e074521446317b915311d3d4d" diff --git a/Cargo.toml b/Cargo.toml index fe612fc..b28c2a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,7 +38,9 @@ flume = { version = "0.12.0", default-features = false, features = ["async"] } xflags = "0.4.0-pre.2" mimalloc = "0.1.43" nix = { version = "0.31.0", features = ["signal"] } -mupdf = { git = "https://github.com/messense/mupdf-rs.git", rev = "d7441b9998c92135e329559c0aa71d9dc92cf4de", default-features = false, features = ["svg", "system-fonts", "img"] } +# mupdf = { git = "https://github.com/messense/mupdf-rs.git", rev = "d7441b9998c92135e329559c0aa71d9dc92cf4de", default-features = false, features = ["svg", "system-fonts", "img"] } +hayro = { version = "0.7", default-features = false } +color = "0.3" rayon = { version = "1", default-features = false } # kittage = { path = "../kittage/", features = ["crossterm-tokio", "image-crate", "log"] } kittage = { version = "0.4.0", features = ["crossterm-tokio", "image-crate", "log"] } @@ -64,8 +66,8 @@ lto = "fat" [features] default = [] tracing = ["tokio/tracing", "dep:console-subscriber"] -epub = ["mupdf/epub"] -cbz = ["mupdf/cbz"] +# epub = ["mupdf/epub"] +# cbz = ["mupdf/cbz"] [dev-dependencies] criterion = { version = "0.8.0", features = ["async_tokio"] } diff --git a/src/converter.rs b/src/converter.rs index 177aa36..76db275 100644 --- a/src/converter.rs +++ b/src/converter.rs @@ -6,7 +6,7 @@ use std::{ use flume::{Receiver, SendError, Sender, TryRecvError}; use futures_util::stream::StreamExt as _; -use image::{DynamicImage, codecs::pnm::PnmDecoder}; +use image::{DynamicImage, RgbaImage, codecs::pnm::PnmDecoder}; use kittage::NumberOrId; use ratatui::layout::Rect; use ratatui_image::{ @@ -112,18 +112,23 @@ pub async fn run_conversion_loop( return Ok(None); }; - let decoder = PnmDecoder::new(Cursor::new(&page_info.img_data.pixels)).map_err(|e| { - RenderError::Converting(format!( - "The image data provided from mupdf was not in pnm format ({e}); don't know how to convert" - )) - })?; + // let decoder = RgbaImage::new(page_info.img_dataCursor::new(&page_info.img_data.pixels)).map_err(|e| { + // RenderError::Converting(format!( + // "The image data provided from `hayro` was not in Rgba8 format ({e}); don't know how to convert" + // )) + // })?; + + let rgba_image = RgbaImage::from_vec( + page_info.img_data.width_px as u32, + page_info.img_data.height_px as u32, + page_info.img_data.pixels + ) + .expect("Buffer is big enough, we created it!"); // The image we get should always already be `ImageRgb8`, so this `into` shouldn't do any // conversions or anything, but just in case some underlying detail of mupdf or image // changes, we do the `into` instead of just `match + unreachable!()` to avoid panicking - let mut dyn_img = DynamicImage::from_decoder(decoder) - .map_err(|e| RenderError::Converting(format!("Can't load image: {e}")))? - .into_rgb8(); + let mut dyn_img = DynamicImage::ImageRgba8(rgba_image).into_rgb8(); for quad in &*page_info.result_rects { dyn_img diff --git a/src/renderer.rs b/src/renderer.rs index 9b93c56..de63196 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -1,9 +1,11 @@ -use std::{collections::VecDeque, num::NonZeroUsize, path::Path, thread::sleep, time::Duration}; +use std::{ + collections::VecDeque, fs::File, io::BufReader, num::NonZeroUsize, path::Path, thread::sleep, + time::Duration +}; +use color::PremulRgba8; use flume::{Receiver, SendError, Sender, TryRecvError}; -use mupdf::{ - Colorspace, Document, Matrix, Page, Pixmap, Quad, TextPageFlags, text_page::SearchHitResponse -}; +use hayro::{hayro_interpret, hayro_syntax::Pdf, vello_cpu::Pixmap}; use ratatui::layout::Rect; use crate::{ @@ -27,7 +29,9 @@ pub enum RenderNotif { #[derive(Debug)] pub enum RenderError { Notify(notify::Error), - Doc(mupdf::error::Error), + Opening(std::io::Error), + Doc(hayro::hayro_syntax::LoadPdfError), + UnknownPageNum(usize), Converting(String) } @@ -57,7 +61,9 @@ pub struct PageInfo { pub struct ImageData { pub pixels: Vec, pub cell_w: u16, - pub cell_h: u16 + pub cell_h: u16, + pub height_px: u16, + pub width_px: u16 } #[derive(Default)] @@ -105,7 +111,6 @@ pub fn start_rendering( // And although the font size could theoretically change, we aren't accounting for that right // now, so we just use the values passed in. - let mut stored_doc = None; let mut invert = false; let mut rotate = RotateDirection::Deg0; let mut preserved_area = None; @@ -117,55 +122,43 @@ pub fn start_rendering( let path = path.to_string_lossy(); 'reload: loop { - // Need to do this weird borrow thing so that we convert `Cow<'_, str>` -> `&str` on windows - // and keep unix a `&Path` -> `&Path` 'cause there are different requirements within mupdf - // about file paths per-platform - #[cfg_attr(unix, expect(clippy::borrow_deref_ref))] - let doc = match Document::open(&*path) { + // i'm not a pdf_file + // TODO: remove the comment above + let pdf_data = match std::fs::read(path) { + Err(e) => { + sender.send(Err(RenderError::Opening(e)))?; + continue; + } + Ok(f) => f + }; + + let pdf = match Pdf::new(pdf_data) { Err(e) => { // if there's an error, tell the main loop sender.send(Err(RenderError::Doc(e)))?; - match stored_doc { - Some(ref d) => d, - None => { - // then wait for a reload notif (since what probably happened is that the file was - // temporarily removed to facilitate a save or something like that) - while let Ok(msg) = receiver.recv() { - // and once that comes, just try to reload again - if matches!(msg, RenderNotif::Reload) { - continue 'reload; - } - } - // if that while let Ok ever fails and we exit out of that loop, the main thread is - // done, so we're fine to just return - return Ok(()); + // then wait for a reload notif (since what probably happened is that the file was + // temporarily removed to facilitate a save or something like that) + while let Ok(msg) = receiver.recv() { + // and once that comes, just try to reload again + if matches!(msg, RenderNotif::Reload) { + continue 'reload; } } + // if that while let Ok ever fails and we exit out of that loop, the main thread is + // done, so we're fine to just return + return Ok(()); } Ok(d) => { - if stored_doc.is_some() { - sender.send(Ok(RenderInfo::Reloaded))?; - } - &*stored_doc.insert(d) + // if stored_doc.is_some() { + // sender.send(Ok(RenderInfo::Reloaded))?; + // } + d } }; - let n_pages = match doc.page_count() { - Ok(n) => match NonZeroUsize::new(n as usize) { - Some(n) => n, - None => { - sleep(Duration::from_secs(1)); - continue 'reload; - } - }, - Err(e) => { - sender.send(Err(RenderError::Doc(e)))?; - // just basic backoff i think - sleep(Duration::from_secs(1)); - continue 'reload; - } - }; + let n_pages = + NonZeroUsize::new(pdf.pages().len()).expect("PDF always has non-zero amount of pages"); sender.send(Ok(RenderInfo::NumPages(n_pages.get())))?; @@ -313,15 +306,45 @@ 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 page = match doc.load_page(page_num as i32) { - Err(e) => { - sender.send(Err(RenderError::Doc(e)))?; - continue; - } - Ok(p) => p + let Some(page) = pdf.pages().get(page_num) else { + sender.send(Err(RenderError::UnknownPageNum(page_num)))?; + continue; }; // render the page + + // FIXME: these should be reused between iterations + let hayro_cache = hayro::RenderCache::default(); + let hayro_interpreter_settings = hayro_interpret::InterpreterSettings::default(); + let hayro_render_settings = hayro::RenderSettings::default(); // FIXME: should be configurable! + + let pixmap = hayro::render( + page, + &hayro_cache, + &hayro_interpreter_settings, + &hayro_render_settings + ); + let w = pixmap.width(); + let h = pixmap.height(); + log::debug!("got pixmap for page {page_num} with WxH {w}x{h}"); + + sender.send(Ok(RenderInfo::Page(PageInfo { + img_data: ImageData { + // FIXME: can we avoid taking the + // slice and constructing Vec, just + // steal the existing bufer instead? + pixels: pixmap.data_as_u8_slice().to_vec(), + // FIXME: do we really need these floating point ops? + cell_w: (f32::from(w) / f32::from(col_w)) as u16, + cell_h: (f32::from(h) / f32::from(col_h)) as u16, + width_px: w, + height_px: h + }, + page_num, + result_rects: Vec::new() // FIXME: do this! + })))?; + + #[cfg(false)] match render_single_page_to_ctx( &page, search_term.as_deref(), @@ -345,8 +368,6 @@ pub fn start_rendering( continue; } - log::debug!("got pixmap for page {page_num} with WxH {w}x{h}"); - rendered.num_search_found = Some(ctx.result_rects.len()); rendered.successful = true; @@ -376,6 +397,7 @@ pub fn start_rendering( // Now, if we have a search term, we want to look through the rest of the document past // what we've just rendered (and looked at the search results of) + #[cfg(false)] if let Some(ref term) = search_term { let mut search_start = start_point; loop { @@ -476,6 +498,7 @@ struct RenderedContext { result_rects: Vec } +#[cfg(false)] #[expect(clippy::too_many_arguments)] fn render_single_page_to_ctx( page: &Page, @@ -571,6 +594,7 @@ pub struct HighlightRect { pub lr_y: u32 } +#[cfg(false)] #[inline] fn search_page( page: &Page, @@ -592,6 +616,7 @@ fn search_page( .map(Option::unwrap_or_default) } +#[cfg(false)] #[inline] fn count_search_results(page: &Page, search_term: &str) -> Result { page.to_text_page(TextPageFlags::empty()).and_then(|page| { diff --git a/src/tui.rs b/src/tui.rs index 707823d..2765927 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -991,8 +991,11 @@ impl Tui { pub fn show_error(&mut self, err: RenderError) { self.set_msg(MessageSetting::Some(BottomMessage::Error(match err { RenderError::Notify(e) => format!("Auto-reload failed: {e}"), - RenderError::Doc(e) => format!("Couldn't process document: {e}"), - RenderError::Converting(e) => format!("Couldn't convert page after rendering: {e}") + RenderError::Doc(e) => format!("Couldn't process document: {e:?}"), + RenderError::Converting(e) => format!("Couldn't convert page after rendering: {e}"), + RenderError::Opening(e) => format!("Couldn't open the document: {e}"), + RenderError::UnknownPageNum(num) => + format!("Encountered out-of-bounds page number {num} when rendering"), }))); }