This commit is contained in:
Blaž Hrastnik 2022-04-13 23:48:49 +09:00
parent 9438430e98
commit 8dc9ad7997
No known key found for this signature in database
GPG Key ID: 1238B9C4AD889640
13 changed files with 1678 additions and 1123 deletions

567
Cargo.lock generated
View File

@ -2,12 +2,6 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 3
[[package]]
name = "Inflector"
version = "0.11.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3"
[[package]] [[package]]
name = "adler" name = "adler"
version = "1.0.2" version = "1.0.2"
@ -20,6 +14,17 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
[[package]]
name = "ahash"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
dependencies = [
"getrandom",
"once_cell",
"version_check",
]
[[package]] [[package]]
name = "aho-corasick" name = "aho-corasick"
version = "0.7.18" version = "0.7.18"
@ -29,12 +34,6 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "aliasable"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd"
[[package]] [[package]]
name = "android_glue" name = "android_glue"
version = "0.2.3" version = "0.2.3"
@ -53,12 +52,53 @@ version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5d78ce20460b82d3fa150275ed9d55e21064fc7951177baacf86a145c4a4b1f" checksum = "c5d78ce20460b82d3fa150275ed9d55e21064fc7951177baacf86a145c4a4b1f"
[[package]]
name = "arrayvec"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
[[package]]
name = "ash"
version = "0.34.0+1.2.203"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0f780da53d0063880d45554306489f09dd8d1bda47688b4a57bc579119356df"
dependencies = [
"libloading",
]
[[package]]
name = "atty"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
dependencies = [
"hermit-abi",
"libc",
"winapi",
]
[[package]] [[package]]
name = "autocfg" name = "autocfg"
version = "1.1.0" version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "bit-set"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de"
dependencies = [
"bit-vec",
]
[[package]]
name = "bit-vec"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "1.3.2" version = "1.3.2"
@ -146,6 +186,12 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "cfg_aliases"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
[[package]] [[package]]
name = "cgl" name = "cgl"
version = "0.3.2" version = "0.3.2"
@ -220,6 +266,16 @@ dependencies = [
"objc", "objc",
] ]
[[package]]
name = "codespan-reporting"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
dependencies = [
"termcolor",
"unicode-width",
]
[[package]] [[package]]
name = "color_quant" name = "color_quant"
version = "1.1.0" version = "1.1.0"
@ -245,6 +301,12 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "copyless"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536"
[[package]] [[package]]
name = "core-foundation" name = "core-foundation"
version = "0.7.0" version = "0.7.0"
@ -378,6 +440,17 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35"
[[package]]
name = "d3d12"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2daefd788d1e96e0a9d66dee4b828b883509bc3ea9ce30665f04c3246372690c"
dependencies = [
"bitflags",
"libloading",
"winapi",
]
[[package]] [[package]]
name = "darling" name = "darling"
version = "0.13.1" version = "0.13.1"
@ -488,6 +561,19 @@ dependencies = [
"encoding_rs", "encoding_rs",
] ]
[[package]]
name = "env_logger"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3"
dependencies = [
"atty",
"humantime",
"log",
"regex",
"termcolor",
]
[[package]] [[package]]
name = "error-code" name = "error-code"
version = "2.3.1" version = "2.3.1"
@ -509,28 +595,6 @@ dependencies = [
"thiserror", "thiserror",
] ]
[[package]]
name = "femtovg"
version = "0.3.3"
dependencies = [
"bitflags",
"fnv",
"generational-arena",
"glow",
"glutin",
"image",
"imgref",
"lru",
"ouroboros",
"rgb",
"rustybuzz",
"ttf-parser",
"unicode-bidi",
"unicode-segmentation",
"wasm-bindgen",
"web-sys",
]
[[package]] [[package]]
name = "fern" name = "fern"
version = "0.6.1" version = "0.6.1"
@ -617,12 +681,12 @@ dependencies = [
] ]
[[package]] [[package]]
name = "generational-arena" name = "fxhash"
version = "0.2.8" version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e1d3b771574f62d0548cee0ad9057857e9fc25d7a3335f140c84f6acd0bf601" checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
dependencies = [ dependencies = [
"cfg-if 0.1.10", "byteorder",
] ]
[[package]] [[package]]
@ -647,6 +711,12 @@ dependencies = [
"xml-rs", "xml-rs",
] ]
[[package]]
name = "glam"
version = "0.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3412e74893a912839a67e975aca0c88561e20e5461d2d358a5fa6d3b229fae59"
[[package]] [[package]]
name = "globset" name = "globset"
version = "0.4.8" version = "0.4.8"
@ -744,6 +814,45 @@ dependencies = [
"gl_generator", "gl_generator",
] ]
[[package]]
name = "gpu-alloc"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fc59e5f710e310e76e6707f86c561dd646f69a8876da9131703b2f717de818d"
dependencies = [
"bitflags",
"gpu-alloc-types",
]
[[package]]
name = "gpu-alloc-types"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54804d0d6bc9d7f26db4eaec1ad10def69b599315f487d32c334a80d1efe67a5"
dependencies = [
"bitflags",
]
[[package]]
name = "gpu-descriptor"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a538f217be4d405ff4719a283ca68323cc2384003eca5baaa87501e821c81dda"
dependencies = [
"bitflags",
"gpu-descriptor-types",
"hashbrown",
]
[[package]]
name = "gpu-descriptor-types"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "363e3677e55ad168fef68cf9de3a4a310b53124c5e784c53a1d70e92d23f2126"
dependencies = [
"bitflags",
]
[[package]] [[package]]
name = "grep-matcher" name = "grep-matcher"
version = "0.1.5" version = "0.1.5"
@ -783,6 +892,15 @@ dependencies = [
"memmap2", "memmap2",
] ]
[[package]]
name = "hashbrown"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
dependencies = [
"ahash",
]
[[package]] [[package]]
name = "helix-core" name = "helix-core"
version = "0.6.0" version = "0.6.0"
@ -805,7 +923,7 @@ dependencies = [
"smartstring", "smartstring",
"toml", "toml",
"tree-sitter", "tree-sitter",
"unicode-general-category 0.5.1", "unicode-general-category",
"unicode-segmentation", "unicode-segmentation",
"unicode-width", "unicode-width",
] ]
@ -916,12 +1034,16 @@ name = "helix-ui"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"console_error_panic_hook", "console_error_panic_hook",
"femtovg", "env_logger",
"glam",
"glutin", "glutin",
"helix-view", "helix-view",
"image", "image",
"instant", "instant",
"pollster",
"resource", "resource",
"swash",
"wgpu",
"winit", "winit",
] ]
@ -970,6 +1092,21 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "hexf-parse"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
[[package]]
name = "humantime"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f"
dependencies = [
"quick-error",
]
[[package]] [[package]]
name = "ident_case" name = "ident_case"
version = "1.0.1" version = "1.0.1"
@ -1022,10 +1159,20 @@ dependencies = [
] ]
[[package]] [[package]]
name = "imgref" name = "indexmap"
version = "1.9.1" version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41d0c0db6c932f8262e0ed8909f2e7f8c0e9b1cfb4da884267ce09a10be54365" checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee"
dependencies = [
"autocfg",
"hashbrown",
]
[[package]]
name = "inplace_it"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90953f308a79fe6d62a4643e51f848fbfddcd05975a38e69fdf4ab86a7baf7ca"
[[package]] [[package]]
name = "instant" name = "instant"
@ -1079,6 +1226,16 @@ dependencies = [
"serde_json", "serde_json",
] ]
[[package]]
name = "khronos-egl"
version = "4.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3"
dependencies = [
"libc",
"libloading",
]
[[package]] [[package]]
name = "khronos_api" name = "khronos_api"
version = "3.1.0" version = "3.1.0"
@ -1126,12 +1283,6 @@ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
] ]
[[package]]
name = "lru"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcb87f3080f6d1d69e8c564c0fcfde1d7aa8cc451ce40cae89479111f03bc0eb"
[[package]] [[package]]
name = "lsp-types" name = "lsp-types"
version = "0.93.0" version = "0.93.0"
@ -1184,6 +1335,20 @@ dependencies = [
"autocfg", "autocfg",
] ]
[[package]]
name = "metal"
version = "0.23.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0514f491f4cc03632ab399ee01e2c1c1b12d3e1cf2d667c1ff5f87d6dcd2084"
dependencies = [
"bitflags",
"block",
"core-graphics-types",
"foreign-types",
"log",
"objc",
]
[[package]] [[package]]
name = "minimal-lexical" name = "minimal-lexical"
version = "0.2.1" version = "0.2.1"
@ -1222,6 +1387,24 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "naga"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3012f2dbcc79e8e0b5825a4836a7106a75dd9b2fe42c528163be0f572538c705"
dependencies = [
"bit-set",
"bitflags",
"codespan-reporting",
"hexf-parse",
"indexmap",
"log",
"num-traits",
"rustc-hash",
"spirv",
"thiserror",
]
[[package]] [[package]]
name = "ndk" name = "ndk"
version = "0.5.0" version = "0.5.0"
@ -1386,6 +1569,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
dependencies = [ dependencies = [
"malloc_buf", "malloc_buf",
"objc_exception",
]
[[package]]
name = "objc_exception"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4"
dependencies = [
"cc",
] ]
[[package]] [[package]]
@ -1403,30 +1596,6 @@ dependencies = [
"shared_library", "shared_library",
] ]
[[package]]
name = "ouroboros"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f31a3b678685b150cba82b702dcdc5e155893f63610cf388d30cd988d4ca2bf"
dependencies = [
"aliasable",
"ouroboros_macro",
"stable_deref_trait",
]
[[package]]
name = "ouroboros_macro"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "084fd65d5dd8b3772edccb5ffd1e4b7eba43897ecd0f9401e330e8c542959408"
dependencies = [
"Inflector",
"proc-macro-error",
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "parking_lot" name = "parking_lot"
version = "0.11.2" version = "0.11.2"
@ -1511,6 +1680,12 @@ dependencies = [
"miniz_oxide", "miniz_oxide",
] ]
[[package]]
name = "pollster"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7"
[[package]] [[package]]
name = "proc-macro-crate" name = "proc-macro-crate"
version = "1.1.3" version = "1.1.3"
@ -1521,30 +1696,6 @@ dependencies = [
"toml", "toml",
] ]
[[package]]
name = "proc-macro-error"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
dependencies = [
"proc-macro-error-attr",
"proc-macro2",
"quote",
"syn",
"version_check",
]
[[package]]
name = "proc-macro-error-attr"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
dependencies = [
"proc-macro2",
"quote",
"version_check",
]
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.36" version = "1.0.36"
@ -1554,6 +1705,12 @@ dependencies = [
"unicode-xid", "unicode-xid",
] ]
[[package]]
name = "profiling"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9145ac0af1d93c638c98c40cf7d25665f427b2a44ad0a99b1dccf3e2f25bb987"
[[package]] [[package]]
name = "pulldown-cmark" name = "pulldown-cmark"
version = "0.9.1" version = "0.9.1"
@ -1565,6 +1722,12 @@ dependencies = [
"unicase", "unicase",
] ]
[[package]]
name = "quick-error"
version = "1.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
[[package]] [[package]]
name = "quickcheck" name = "quickcheck"
version = "1.0.3" version = "1.0.3"
@ -1601,6 +1764,12 @@ dependencies = [
"getrandom", "getrandom",
] ]
[[package]]
name = "range-alloc"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63e935c45e09cc6dcf00d2f0b2d630a58f4095320223d47fc68918722f0538b6"
[[package]] [[package]]
name = "raw-window-handle" name = "raw-window-handle"
version = "0.4.2" version = "0.4.2"
@ -1653,6 +1822,12 @@ version = "0.6.25"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
[[package]]
name = "renderdoc-sys"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157"
[[package]] [[package]]
name = "resource" name = "resource"
version = "0.5.0" version = "0.5.0"
@ -1665,15 +1840,6 @@ version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c31b5c4033f8fdde8700e4657be2c497e7288f01515be52168c631e2e4d4086" checksum = "8c31b5c4033f8fdde8700e4657be2c497e7288f01515be52168c631e2e4d4086"
[[package]]
name = "rgb"
version = "0.8.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e74fdc210d8f24a7dbfedc13b04ba5764f5232754ccebfdf5fff1bad791ccbc6"
dependencies = [
"bytemuck",
]
[[package]] [[package]]
name = "ropey" name = "ropey"
version = "1.4.1" version = "1.4.1"
@ -1685,20 +1851,10 @@ dependencies = [
] ]
[[package]] [[package]]
name = "rustybuzz" name = "rustc-hash"
version = "0.5.0" version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25ff94f20221325d000e552781713e53b0d85c1d9551b6f420d12daf5a08eace" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
dependencies = [
"bitflags",
"bytemuck",
"smallvec",
"ttf-parser",
"unicode-bidi-mirroring",
"unicode-ccc",
"unicode-general-category 0.4.0",
"unicode-script",
]
[[package]] [[package]]
name = "ryu" name = "ryu"
@ -1889,10 +2045,14 @@ dependencies = [
] ]
[[package]] [[package]]
name = "stable_deref_trait" name = "spirv"
version = "1.2.0" version = "0.2.0+1.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830"
dependencies = [
"bitflags",
"num-traits",
]
[[package]] [[package]]
name = "static_assertions" name = "static_assertions"
@ -1918,6 +2078,15 @@ version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
[[package]]
name = "swash"
version = "0.1.4"
source = "git+https://github.com/dfrg/swash#d3f8bbfa5f96688ab94278db6f85e00ba383e3f8"
dependencies = [
"yazi",
"zeno",
]
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.90" version = "1.0.90"
@ -1929,6 +2098,15 @@ dependencies = [
"unicode-xid", "unicode-xid",
] ]
[[package]]
name = "termcolor"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
dependencies = [
"winapi-util",
]
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.30" version = "1.0.30"
@ -2043,12 +2221,6 @@ dependencies = [
"regex", "regex",
] ]
[[package]]
name = "ttf-parser"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c74c96594835e10fa545e2a51e8709f30b173a092bfd6036ef2cec53376244f3"
[[package]] [[package]]
name = "unicase" name = "unicase"
version = "2.6.0" version = "2.6.0"
@ -2064,24 +2236,6 @@ version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f"
[[package]]
name = "unicode-bidi-mirroring"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56d12260fb92d52f9008be7e4bca09f584780eb2266dc8fecc6a192bec561694"
[[package]]
name = "unicode-ccc"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc2520efa644f8268dce4dcd3050eaa7fc044fca03961e9998ac7e2e92b77cf1"
[[package]]
name = "unicode-general-category"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07547e3ee45e28326cc23faac56d44f58f16ab23e413db526debce3b0bfd2742"
[[package]] [[package]]
name = "unicode-general-category" name = "unicode-general-category"
version = "0.5.1" version = "0.5.1"
@ -2097,12 +2251,6 @@ dependencies = [
"tinyvec", "tinyvec",
] ]
[[package]]
name = "unicode-script"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58dd944fd05f2f0b5c674917aea8a4df6af84f2d8de3fe8d988b95d28fb8fb09"
[[package]] [[package]]
name = "unicode-segmentation" name = "unicode-segmentation"
version = "1.9.0" version = "1.9.0"
@ -2188,6 +2336,18 @@ dependencies = [
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
[[package]]
name = "wasm-bindgen-futures"
version = "0.4.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2eb6ec270a31b1d3c7e266b999739109abce8b6c87e4b31fcfcd788b65267395"
dependencies = [
"cfg-if 1.0.0",
"js-sys",
"wasm-bindgen",
"web-sys",
]
[[package]] [[package]]
name = "wasm-bindgen-macro" name = "wasm-bindgen-macro"
version = "0.2.79" version = "0.2.79"
@ -2310,6 +2470,97 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "wgpu"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b97cd781ff044d6d697b632a2e212032c2e957d1afaa21dbf58069cbb8f78567"
dependencies = [
"arrayvec",
"js-sys",
"log",
"naga",
"parking_lot 0.11.2",
"raw-window-handle",
"smallvec",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"wgpu-core",
"wgpu-hal",
"wgpu-types",
]
[[package]]
name = "wgpu-core"
version = "0.12.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4688c000eb841ca55f7b35db659b78d6e1cd77d7caf8fb929f4e181f754047d"
dependencies = [
"arrayvec",
"bitflags",
"cfg_aliases",
"codespan-reporting",
"copyless",
"fxhash",
"log",
"naga",
"parking_lot 0.11.2",
"profiling",
"raw-window-handle",
"smallvec",
"thiserror",
"wgpu-hal",
"wgpu-types",
]
[[package]]
name = "wgpu-hal"
version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93b1a9400e8d7f32dd4dd909bb9a391015d70633d639775ddd3f14d1104bc970"
dependencies = [
"arrayvec",
"ash",
"bit-set",
"bitflags",
"block",
"core-graphics-types",
"d3d12",
"foreign-types",
"fxhash",
"glow",
"gpu-alloc",
"gpu-descriptor",
"inplace_it",
"js-sys",
"khronos-egl",
"libloading",
"log",
"metal",
"naga",
"objc",
"parking_lot 0.11.2",
"profiling",
"range-alloc",
"raw-window-handle",
"renderdoc-sys",
"thiserror",
"wasm-bindgen",
"web-sys",
"wgpu-types",
"winapi",
]
[[package]]
name = "wgpu-types"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "549533d9e1cdd4b4cda7718d33ff500fc4c34b5467b71d76b547ae0324f3b2a2"
dependencies = [
"bitflags",
]
[[package]] [[package]]
name = "which" name = "which"
version = "4.2.5" version = "4.2.5"
@ -2462,3 +2713,15 @@ dependencies = [
"helix-term", "helix-term",
"toml", "toml",
] ]
[[package]]
name = "yazi"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c03b3e19c937b5b9bd8e52b1c88f30cce5c0d33d676cf174866175bb794ff658"
[[package]]
name = "zeno"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c110ba09c9b3a43edd4803d570df0da2414fed6e822e22b976a4e3ef50860701"

View File

@ -16,6 +16,8 @@ default-members = [
"helix-term" "helix-term"
] ]
resolver = "2"
[profile.dev] [profile.dev]
split-debuginfo = "unpacked" split-debuginfo = "unpacked"

View File

@ -7,10 +7,22 @@ edition = "2021"
[dependencies] [dependencies]
helix-view = { version = "0.6", path = "../helix-view", features = ["ui"] } helix-view = { version = "0.6", path = "../helix-view", features = ["ui"] }
femtovg = { path = "../../femtovg" } # femtovg = { path = "../../femtovg" }
# femtovg = "0.3.3"
winit = { version = "0.26.1", default-features = false, features = ["wayland"] } # TODO: figure out wayland-dlopen winit = { version = "0.26.1", default-features = false, features = ["wayland"] } # TODO: figure out wayland-dlopen
resource = "0.5.0" resource = "0.5.0"
image = { version = "0.24.0", default-features = false, features = ["jpeg", "png"] } image = { version = "0.24.0", default-features = false, features = ["jpeg", "png"] }
console_error_panic_hook = "0.1.7" console_error_panic_hook = "0.1.7"
glutin = "0.28.0" glutin = "0.28.0"
instant = "0.1.12" instant = "0.1.12"
# swash = "0.1.4"
swash = { git = "https://github.com/dfrg/swash" }
# parley = { git = "https://github.com/dfrg/parley" }
# lyon = "0.17.10"
wgpu = "0.12"
pollster = "0.2"
glam = "0.20"
env_logger = "0.6"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

965
helix-ui/src/femto.rs Normal file
View File

@ -0,0 +1,965 @@
use resource::resource;
use instant::Instant;
use winit::event::{ElementState, Event, KeyboardInput, MouseButton, VirtualKeyCode, WindowEvent};
use winit::event_loop::{ControlFlow, EventLoop};
use winit::window::WindowBuilder;
//use glutin::{GlRequest, Api};
use femtovg::{
//CompositeOperation,
renderer::OpenGl,
Align,
Baseline,
Canvas,
Color,
FontId,
ImageFlags,
Paint,
Path,
Renderer,
Solidity,
};
// mezzopiano
// —
// 03/13/2022
// I'm also assuming that there's some logic bugs in the demo application, which wasn't built with this in mind; I have a much simpler application that I'm happy to show if that would be helpful (would need to extract an example). As a rough solution, I apply the following transformation on Winit's WindowEvent::ScaleFactorChanged:
// /* ... in an application struct/impl ... */
// pub fn rescale(
// &mut self,
// new_size: winit::dpi::PhysicalSize<u32>,
// new_scale_factor: f64,
// ) {
// // Update translation
// // (TODO: This is a guestimate and not well-tested;
// // the size updates might turn out ot be completely unnecessary)
// let shift = self.size.height as f32 - new_size.height as f32;
// self.canvas.translate(0.0, -shift);
// // Update properties
// self.size = new_size;
// self.scale_factor = new_scale_factor;
// self.canvas.set_size(
// self.size.width,
// self.size.height,
// self.scale_factor as f32,
// )
// }
// With this, the canvas position and scale is preserved while the window is moved across screens, but as I'd like to apply further translations and keeping track of everything is getting very hard 😅 . I'm wondering if I'm making a mistake somewhere, or if there might be some way to do this in femto.
pub fn quantize(a: f32, d: f32) -> f32 {
(a / d + 0.5).trunc() * d
}
struct Fonts {
regular: FontId,
bold: FontId,
icons: FontId,
}
fn main() {
// This provides better error messages in debug mode.
// It's disabled in release mode so it doesn't bloat up the file size.
#[cfg(all(debug_assertions, target_arch = "wasm32"))]
console_error_panic_hook::set_once();
let el = EventLoop::new();
#[cfg(not(target_arch = "wasm32"))]
let (renderer, windowed_context) = {
use glutin::ContextBuilder;
let wb = WindowBuilder::new()
.with_inner_size(winit::dpi::LogicalSize::<f32>::new(1000., 600.))
.with_title("femtovg demo");
//let windowed_context = ContextBuilder::new().with_gl(GlRequest::Specific(Api::OpenGlEs, (2, 0))).with_vsync(false).build_windowed(wb, &el).unwrap();
//let windowed_context = ContextBuilder::new().with_vsync(false).with_multisampling(8).build_windowed(wb, &el).unwrap();
let windowed_context = ContextBuilder::new()
.with_vsync(true) // TODO: set to true?
.build_windowed(wb, &el)
.unwrap();
let windowed_context = unsafe { windowed_context.make_current().unwrap() };
let renderer =
OpenGl::new_from_glutin_context(&windowed_context).expect("Cannot create renderer");
(renderer, windowed_context)
};
#[cfg(target_arch = "wasm32")]
let (renderer, window) = {
use wasm_bindgen::JsCast;
let canvas = web_sys::window()
.unwrap()
.document()
.unwrap()
.get_element_by_id("canvas")
.unwrap()
.dyn_into::<web_sys::HtmlCanvasElement>()
.unwrap();
use winit::platform::web::WindowBuilderExtWebSys;
let renderer = OpenGl::new_from_html_canvas(&canvas).expect("Cannot create renderer");
let window = WindowBuilder::new()
.with_canvas(Some(canvas))
.build(&el)
.unwrap();
(renderer, window)
};
let mut canvas = Canvas::new(renderer).expect("Cannot create canvas");
// TODO: better femtovg support for variable fonts
let fonts = Fonts {
regular: canvas
.add_font_mem(&resource!("assets/fonts/Inter\ Variable/Inter.ttf"))
.expect("Cannot add font"),
bold: canvas
.add_font_mem(&resource!("assets/fonts/Inter Variable/Inter.ttf"))
.expect("Cannot add font"),
icons: canvas
.add_font_mem(&resource!("assets/entypo.ttf"))
.expect("Cannot add font"),
};
//canvas.add_font("/usr/share/fonts/noto/NotoSansArabic-Regular.ttf").expect("Cannot add font");
//let image_id = canvas.create_image_file("assets/RoomRender.jpg", ImageFlags::FLIP_Y).expect("Cannot create image");
//canvas.blur_image(image_id, 10, 1050, 710, 200, 200);
//let image_id = canvas.load_image_file("assets/RoomRender.jpg", ImageFlags::FLIP_Y).expect("Cannot create image");
// let images = vec![
// canvas
// .load_image_mem(&resource!("assets/images/image1.jpg"), ImageFlags::empty())
// .unwrap(),
// canvas
// .load_image_mem(&resource!("assets/images/image2.jpg"), ImageFlags::empty())
// .unwrap(),
// ];
let mut screenshot_image_id = None;
let start = Instant::now();
let mut prevt = start;
let mut mousex = 0.0;
let mut mousey = 0.0;
let mut dragging = false;
let mut perf = PerfGraph::new();
el.run(move |event, _, control_flow| {
#[cfg(not(target_arch = "wasm32"))]
let window = windowed_context.window();
*control_flow = ControlFlow::Poll;
match event {
Event::LoopDestroyed => return,
Event::WindowEvent { ref event, .. } => match event {
#[cfg(not(target_arch = "wasm32"))]
WindowEvent::Resized(physical_size) => {
println!("resized!");
// TODO: use DPI here?
windowed_context.resize(*physical_size);
}
WindowEvent::CursorMoved {
device_id: _,
position,
..
} => {
if dragging {
let p0 = canvas
.transform()
.inversed()
.transform_point(mousex, mousey);
let p1 = canvas
.transform()
.inversed()
.transform_point(position.x as f32, position.y as f32);
canvas.translate(p1.0 - p0.0, p1.1 - p0.1);
}
mousex = position.x as f32;
mousey = position.y as f32;
}
WindowEvent::MouseWheel {
device_id: _,
delta,
..
} => match delta {
winit::event::MouseScrollDelta::LineDelta(_, y) => {
let pt = canvas
.transform()
.inversed()
.transform_point(mousex, mousey);
canvas.translate(pt.0, pt.1);
canvas.scale(1.0 + (y / 10.0), 1.0 + (y / 10.0));
canvas.translate(-pt.0, -pt.1);
}
winit::event::MouseScrollDelta::PixelDelta(pos) => {
let y = pos.y as f32;
let pt = canvas
.transform()
.inversed()
.transform_point(mousex, mousey);
let rate = 2000.0;
canvas.translate(pt.0, pt.1);
canvas.scale(1.0 + (y / rate), 1.0 + (y / rate));
canvas.translate(-pt.0, -pt.1);
}
},
WindowEvent::MouseInput {
button: MouseButton::Left,
state,
..
} => match state {
ElementState::Pressed => dragging = true,
ElementState::Released => dragging = false,
},
WindowEvent::KeyboardInput {
input:
KeyboardInput {
virtual_keycode: Some(VirtualKeyCode::S),
state: ElementState::Pressed,
..
},
..
} => {
if let Some(screenshot_image_id) = screenshot_image_id {
canvas.delete_image(screenshot_image_id);
}
if let Ok(image) = canvas.screenshot() {
screenshot_image_id = Some(
canvas
.create_image(image.as_ref(), ImageFlags::empty())
.unwrap(),
);
}
}
WindowEvent::CloseRequested => *control_flow = ControlFlow::Exit,
_ => (),
},
Event::RedrawRequested(_) => {
let now = Instant::now();
let dt = (now - prevt).as_secs_f32();
prevt = now;
perf.update(dt);
let dpi_factor = window.scale_factor();
// println!("DPI {}", dpi_factor);
// let dpi_factor = 0.5f64;
let size = window.inner_size();
// let size: winit::dpi::LogicalSize<u32> = window.inner_size().to_logical(dpi_factor); // TODO: adjust for dpi
// window.set_inner_size(size);
// let size = window.inner_size();
// let t = start.elapsed().as_secs_f32();
canvas.set_size(size.width as u32, size.height as u32, dpi_factor as f32);
canvas.clear_rect(
0,
0,
size.width as u32,
size.height as u32,
Color::rgbf(0.3, 0.3, 0.32),
);
// let height = size.height as f32;
// let width = size.width as f32;
let winit::dpi::LogicalSize { width, height: _ } =
size.to_logical::<f32>(dpi_factor);
let pt = canvas
.transform()
.inversed()
.transform_point(mousex, mousey);
let rel_mousex = pt.0;
let rel_mousey = pt.1;
draw_paragraph(
&mut canvas,
fonts.regular,
width - 450.0,
50.0,
150.0,
100.0,
rel_mousex,
rel_mousey,
);
draw_window(
&mut canvas,
&fonts,
"Widgets `n Stuff",
50.0,
50.0,
300.0,
400.0,
);
let x = 60.0;
let mut y = 95.0;
draw_search_box(&mut canvas, &fonts, "Search", x, y, 280.0, 25.0);
y += 40.0;
draw_drop_down(&mut canvas, &fonts, "Effects", 60.0, 135.0, 280.0, 28.0);
y += 45.0;
draw_label(&mut canvas, &fonts, "Login", x, y, 280.0, 20.0);
y += 25.0;
draw_edit_box(&mut canvas, &fonts, "Email", x, y, 280.0, 28.0);
y += 35.0;
draw_edit_box(&mut canvas, &fonts, "Password", x, y, 280.0, 28.0);
y += 38.0;
draw_check_box(&mut canvas, &fonts, "Remember me", x, y, 140.0, 28.0);
draw_button(
&mut canvas,
&fonts,
Some("\u{E740}"),
"Sign in",
x + 138.0,
y,
140.0,
28.0,
Color::rgba(0, 96, 128, 255),
);
y += 45.0;
// Slider
draw_label(&mut canvas, &fonts, "Diameter", x, y, 280.0, 20.0);
y += 25.0;
draw_edit_box_num(
&mut canvas,
&fonts,
"123.00",
"px",
x + 180.0,
y,
100.0,
28.0,
);
y += 55.0;
draw_button(
&mut canvas,
&fonts,
Some("\u{E729}"),
"Delete",
x,
y,
160.0,
28.0,
Color::rgba(128, 16, 8, 255),
);
draw_button(
&mut canvas,
&fonts,
None,
"Cancel",
x + 170.0,
y,
110.0,
28.0,
Color::rgba(0, 0, 0, 0),
);
/*
draw_spinner(&mut canvas, 15.0, 285.0, 10.0, t);
*/
if let Some(image_id) = screenshot_image_id {
let x = size.width as f32 - 512.0;
let y = size.height as f32 - 512.0;
let paint = Paint::image(image_id, x, y, 512.0, 512.0, 0.0, 1.0);
let mut path = Path::new();
path.rect(x, y, 512.0, 512.0);
canvas.fill_path(&mut path, paint);
canvas.stroke_path(&mut path, Paint::color(Color::hex("454545")));
}
// if true {
// let paint = Paint::image(image_id, size.width as f32, 15.0, 1920.0, 1080.0, 0.0, 1.0);
// let mut path = Path::new();
// path.rect(size.width as f32, 15.0, 1920.0, 1080.0);
// canvas.fill_path(&mut path, paint);
// }
canvas.save_with(|canvas| {
canvas.reset();
perf.render(canvas, 5.0, 5.0);
});
//canvas.restore();
canvas.flush();
#[cfg(not(target_arch = "wasm32"))]
windowed_context.swap_buffers().unwrap();
}
Event::MainEventsCleared => {
//scroll = 1.0;
window.request_redraw()
}
_ => (),
}
});
}
fn draw_paragraph<T: Renderer>(
canvas: &mut Canvas<T>,
font: FontId,
x: f32,
y: f32,
width: f32,
_height: f32,
mx: f32,
my: f32,
) {
let text = "This is longer chunk of text.\n\nWould have used lorem ipsum but she was busy jumping over the lazy dog with the fox and all the men who came to the aid of the party.🎉";
canvas.save();
let mut paint = Paint::color(Color::rgba(255, 255, 255, 255));
paint.set_font_size(14.0);
paint.set_font(&[font]);
paint.set_text_align(Align::Left);
paint.set_text_baseline(Baseline::Top);
let mut gutter_y = 0.0;
let mut gutter = 0;
let mut y = y;
let mut px;
let mut caret_x;
let lines = canvas
.break_text_vec(width, text, paint)
.expect("Cannot break text");
for (line_num, line_range) in lines.into_iter().enumerate() {
if let Ok(res) = canvas.fill_text(x, y, &text[line_range], paint) {
let hit = mx > x && mx < (x + width) && my >= y && my < (y + res.height());
if hit {
caret_x = if mx < x + res.width() / 2.0 {
x
} else {
x + res.width()
};
px = x;
for glyph in &res.glyphs {
let x0 = glyph.x;
let x1 = x0 + glyph.width;
let gx = x0 * 0.3 + x1 * 0.7;
if mx >= px && mx < gx {
caret_x = glyph.x;
}
px = gx;
}
let mut path = Path::new();
path.rect(caret_x, y, 1.0, res.height());
canvas.fill_path(&mut path, Paint::color(Color::rgba(255, 192, 0, 255)));
gutter = line_num + 1;
gutter_y = y + 14.0 / 2.0;
}
y += res.height();
}
}
if gutter > 0 {
let mut paint = Paint::color(Color::rgba(255, 192, 0, 255));
paint.set_font_size(12.0);
paint.set_font(&[font]);
paint.set_text_align(Align::Right);
paint.set_text_baseline(Baseline::Middle);
let text = format!("{}", gutter);
if let Ok(res) = canvas.measure_text(x - 10.0, gutter_y, &text, paint) {
let mut path = Path::new();
path.rounded_rect(
res.x - 4.0,
res.y - 2.0,
res.width() + 8.0,
res.height() + 4.0,
(res.height() + 4.0) / 2.0 - 1.0,
);
canvas.fill_path(&mut path, paint);
paint.set_color(Color::rgba(32, 32, 32, 255));
let _ = canvas.fill_text(x - 10.0, gutter_y, &text, paint);
}
}
// let mut start = 0;
// while start < text.len() {
// let substr = &text[start..];
// if let Ok(index) = canvas.break_text(width, substr, paint) {
// if let Ok(res) = canvas.fill_text(x, y, &substr[0..index], paint) {
// y += res.height;
// }
// start += &substr[0..index].len();
// } else {
// break;
// }
// }
canvas.restore();
}
fn draw_window<T: Renderer>(
canvas: &mut Canvas<T>,
fonts: &Fonts,
title: &str,
x: f32,
y: f32,
w: f32,
h: f32,
) {
let corner_radius = 3.0;
canvas.save();
//canvas.global_composite_operation(CompositeOperation::Lighter);
// Window
let mut path = Path::new();
path.rounded_rect(x, y, w, h, corner_radius);
canvas.fill_path(&mut path, Paint::color(Color::rgba(28, 30, 34, 192)));
// Drop shadow
let shadow_paint = Paint::box_gradient(
x,
y + 2.0,
w,
h,
corner_radius * 2.0,
10.0,
Color::rgba(0, 0, 0, 128),
Color::rgba(0, 0, 0, 0),
);
let mut path = Path::new();
path.rect(x - 10.0, y - 10.0, w + 20.0, h + 30.0);
path.rounded_rect(x, y, w, h, corner_radius);
path.solidity(Solidity::Hole);
canvas.fill_path(&mut path, shadow_paint);
// Header
let header_paint = Paint::linear_gradient(
x,
y,
x,
y + 15.0,
Color::rgba(255, 255, 255, 8),
Color::rgba(0, 0, 0, 16),
);
let mut path = Path::new();
path.rounded_rect(x + 1.0, y + 1.0, w - 2.0, 30.0, corner_radius - 1.0);
canvas.fill_path(&mut path, header_paint);
let mut path = Path::new();
path.move_to(x + 0.5, y + 0.5 + 30.0);
path.line_to(x + 0.5 + w - 1.0, y + 0.5 + 30.0);
canvas.stroke_path(&mut path, Paint::color(Color::rgba(0, 0, 0, 32)));
let mut text_paint = Paint::color(Color::rgba(0, 0, 0, 32));
text_paint.set_font_size(16.0);
text_paint.set_font(&[fonts.bold]);
text_paint.set_text_align(Align::Center);
text_paint.set_color(Color::rgba(220, 220, 220, 160));
let _ = canvas.fill_text(x + (w / 2.0), y + 19.0, title, text_paint);
// let bounds = canvas.text_bounds(x + (w / 2.0), y + 19.0, title, text_paint);
//
// let mut path = Path::new();
// path.rect(bounds[0], bounds[1], bounds[2] - bounds[0], bounds[3] - bounds[1]);
// canvas.stroke_path(&mut path, Paint::color(Color::rgba(0, 0, 0, 255)));
canvas.restore();
}
fn draw_search_box<T: Renderer>(
canvas: &mut Canvas<T>,
fonts: &Fonts,
title: &str,
x: f32,
y: f32,
w: f32,
h: f32,
) {
let corner_radius = (h / 2.0) - 1.0;
let bg = Paint::box_gradient(
x,
y + 1.5,
w,
h,
h / 2.0,
5.0,
Color::rgba(0, 0, 0, 16),
Color::rgba(0, 0, 0, 92),
);
let mut path = Path::new();
path.rounded_rect(x, y, w, h, corner_radius);
canvas.fill_path(&mut path, bg);
let mut text_paint = Paint::color(Color::rgba(255, 255, 255, 64));
text_paint.set_font_size((h * 1.3).round());
text_paint.set_font(&[fonts.icons]);
text_paint.set_text_align(Align::Center);
text_paint.set_text_baseline(Baseline::Middle);
let _ = canvas.fill_text(x + h * 0.55, y + h * 0.55, "\u{1F50D}", text_paint);
let mut text_paint = Paint::color(Color::rgba(255, 255, 255, 32));
text_paint.set_font_size(16.0);
text_paint.set_font(&[fonts.regular]);
text_paint.set_text_align(Align::Left);
text_paint.set_text_baseline(Baseline::Middle);
let _ = canvas.fill_text(x + h, y + h * 0.5, title, text_paint);
let mut text_paint = Paint::color(Color::rgba(255, 255, 255, 32));
text_paint.set_font_size((h * 1.3).round());
text_paint.set_font(&[fonts.icons]);
text_paint.set_text_align(Align::Center);
text_paint.set_text_baseline(Baseline::Middle);
let _ = canvas.fill_text(x + w - h * 0.55, y + h * 0.45, "\u{2716}", text_paint);
}
fn draw_drop_down<T: Renderer>(
canvas: &mut Canvas<T>,
fonts: &Fonts,
title: &str,
x: f32,
y: f32,
w: f32,
h: f32,
) {
let corner_radius = 4.0;
let bg = Paint::linear_gradient(
x,
y,
x,
y + h,
Color::rgba(255, 255, 255, 16),
Color::rgba(0, 0, 0, 16),
);
let mut path = Path::new();
path.rounded_rect(x + 1.0, y + 1.0, w - 2.0, h - 2.0, corner_radius);
canvas.fill_path(&mut path, bg);
let mut path = Path::new();
path.rounded_rect(x + 0.5, y + 0.5, w - 1.0, h - 1.0, corner_radius - 0.5);
canvas.stroke_path(&mut path, Paint::color(Color::rgba(0, 0, 0, 48)));
let mut text_paint = Paint::color(Color::rgba(255, 255, 255, 160));
text_paint.set_font_size(16.0);
text_paint.set_font(&[fonts.regular]);
text_paint.set_text_align(Align::Left);
text_paint.set_text_baseline(Baseline::Middle);
let _ = canvas.fill_text(x + h * 0.3, y + h * 0.5, title, text_paint);
let mut text_paint = Paint::color(Color::rgba(255, 255, 255, 64));
text_paint.set_font_size((h * 1.3).round());
text_paint.set_font(&[fonts.icons]);
text_paint.set_text_align(Align::Center);
text_paint.set_text_baseline(Baseline::Middle);
let _ = canvas.fill_text(x + w - h * 0.5, y + h * 0.45, "\u{E75E}", text_paint);
}
fn draw_label<T: Renderer>(
canvas: &mut Canvas<T>,
fonts: &Fonts,
title: &str,
x: f32,
y: f32,
_w: f32,
h: f32,
) {
let mut text_paint = Paint::color(Color::rgba(255, 255, 255, 128));
text_paint.set_font_size(14.0);
text_paint.set_font(&[fonts.regular]);
text_paint.set_text_align(Align::Left);
text_paint.set_text_baseline(Baseline::Middle);
let _ = canvas.fill_text(x, y + h * 0.5, title, text_paint);
}
fn draw_edit_box_base<T: Renderer>(canvas: &mut Canvas<T>, x: f32, y: f32, w: f32, h: f32) {
let paint = Paint::box_gradient(
x + 1.0,
y + 2.5,
w - 2.0,
h - 2.0,
3.0,
4.0,
Color::rgba(255, 255, 255, 32),
Color::rgba(32, 32, 32, 32),
);
let mut path = Path::new();
path.rounded_rect(x + 1.0, y + 1.0, w - 2.0, h - 2.0, 3.0);
canvas.fill_path(&mut path, paint);
let mut path = Path::new();
path.rounded_rect(x + 0.5, y + 0.5, w - 1.0, h - 1.0, 3.5);
canvas.stroke_path(&mut path, Paint::color(Color::rgba(0, 0, 0, 48)));
}
fn draw_edit_box<T: Renderer>(
canvas: &mut Canvas<T>,
fonts: &Fonts,
title: &str,
x: f32,
y: f32,
w: f32,
h: f32,
) {
draw_edit_box_base(canvas, x, y, w, h);
let mut text_paint = Paint::color(Color::rgba(255, 255, 255, 64));
text_paint.set_font_size(16.0);
text_paint.set_font(&[fonts.regular]);
text_paint.set_text_align(Align::Left);
text_paint.set_text_baseline(Baseline::Middle);
let _ = canvas.fill_text(x + h * 0.5, y + h * 0.5, title, text_paint);
}
fn draw_edit_box_num<T: Renderer>(
canvas: &mut Canvas<T>,
fonts: &Fonts,
title: &str,
units: &str,
x: f32,
y: f32,
w: f32,
h: f32,
) {
draw_edit_box_base(canvas, x, y, w, h);
let mut paint = Paint::color(Color::rgba(255, 255, 255, 64));
paint.set_font_size(14.0);
paint.set_font(&[fonts.regular]);
paint.set_text_align(Align::Right);
paint.set_text_baseline(Baseline::Middle);
if let Ok(layout) = canvas.measure_text(0.0, 0.0, units, paint) {
let _ = canvas.fill_text(x + w - h * 0.3, y + h * 0.5, units, paint);
paint.set_font_size(16.0);
paint.set_color(Color::rgba(255, 255, 255, 128));
let _ = canvas.fill_text(x + w - layout.width() - h * 0.5, y + h * 0.5, title, paint);
}
}
fn draw_check_box<T: Renderer>(
canvas: &mut Canvas<T>,
fonts: &Fonts,
text: &str,
x: f32,
y: f32,
_w: f32,
h: f32,
) {
let mut paint = Paint::color(Color::rgba(255, 255, 255, 160));
paint.set_font_size(14.0);
paint.set_font(&[fonts.regular]);
paint.set_text_baseline(Baseline::Middle);
let _ = canvas.fill_text(x + 28.0, y + h * 0.5, text, paint);
paint = Paint::box_gradient(
x + 1.0,
y + (h * 0.5).floor() - 9.0 + 1.0,
18.0,
18.0,
3.0,
3.0,
Color::rgba(0, 0, 0, 32),
Color::rgba(0, 0, 0, 92),
);
let mut path = Path::new();
path.rounded_rect(x + 1.0, y + (h * 0.5).floor() - 9.0, 18.0, 18.0, 3.0);
canvas.fill_path(&mut path, paint);
paint = Paint::color(Color::rgba(255, 255, 255, 128));
paint.set_font_size(36.0);
paint.set_font(&[fonts.icons]);
paint.set_text_align(Align::Center);
paint.set_text_baseline(Baseline::Middle);
let _ = canvas.fill_text(x + 9.0 + 2.0, y + h * 0.5, "\u{2713}", paint);
}
fn draw_button<T: Renderer>(
canvas: &mut Canvas<T>,
fonts: &Fonts,
preicon: Option<&str>,
text: &str,
x: f32,
y: f32,
w: f32,
h: f32,
color: Color,
) {
let corner_radius = 4.0;
let a = if color.is_black() { 16 } else { 32 };
let bg = Paint::linear_gradient(
x,
y,
x,
y + h,
Color::rgba(255, 255, 255, a),
Color::rgba(0, 0, 0, a),
);
let mut path = Path::new();
path.rounded_rect(x + 1.0, y + 1.0, w - 2.0, h - 2.0, corner_radius - 1.0);
if !color.is_black() {
canvas.fill_path(&mut path, Paint::color(color));
}
canvas.fill_path(&mut path, bg);
let mut path = Path::new();
path.rounded_rect(x + 0.5, y + 0.5, w - 1.0, h - 1.0, corner_radius - 0.5);
canvas.stroke_path(&mut path, Paint::color(Color::rgba(0, 0, 0, 48)));
let mut paint = Paint::color(Color::rgba(255, 255, 255, 96));
paint.set_font_size(15.0);
paint.set_font(&[fonts.bold]);
paint.set_text_align(Align::Left);
paint.set_text_baseline(Baseline::Middle);
let tw = if let Ok(layout) = canvas.measure_text(0.0, 0.0, text, paint) {
layout.width()
} else {
0.0
};
let mut iw = 0.0;
if let Some(icon) = preicon {
paint.set_font(&[fonts.icons]);
paint.set_font_size(h * 1.3);
if let Ok(layout) = canvas.measure_text(0.0, 0.0, icon, paint) {
iw = layout.width() + (h * 0.15);
}
let _ = canvas.fill_text(x + w * 0.5 - tw * 0.5 - iw * 0.75, y + h * 0.5, icon, paint);
}
paint.set_font_size(15.0);
paint.set_font(&[fonts.regular]);
paint.set_color(Color::rgba(0, 0, 0, 160));
let _ = canvas.fill_text(
x + w * 0.5 - tw * 0.5 + iw * 0.25,
y + h * 0.5 - 1.0,
text,
paint,
);
paint.set_color(Color::rgba(255, 255, 255, 160));
let _ = canvas.fill_text(x + w * 0.5 - tw * 0.5 + iw * 0.25, y + h * 0.5, text, paint);
}
struct PerfGraph {
history_count: usize,
values: Vec<f32>,
head: usize,
}
impl PerfGraph {
fn new() -> Self {
Self {
history_count: 100,
values: vec![0.0; 100],
head: Default::default(),
}
}
fn update(&mut self, frame_time: f32) {
self.head = (self.head + 1) % self.history_count;
self.values[self.head] = frame_time;
}
fn get_average(&self) -> f32 {
self.values.iter().map(|v| *v).sum::<f32>() / self.history_count as f32
}
fn render<T: Renderer>(&self, canvas: &mut Canvas<T>, x: f32, y: f32) {
let avg = self.get_average();
let w = 200.0;
let h = 35.0;
let mut path = Path::new();
path.rect(x, y, w, h);
canvas.fill_path(&mut path, Paint::color(Color::rgba(0, 0, 0, 128)));
let mut path = Path::new();
path.move_to(x, y + h);
for i in 0..self.history_count {
let mut v = 1.0 / (0.00001 + self.values[(self.head + i) % self.history_count]);
if v > 80.0 {
v = 80.0;
}
let vx = x + (i as f32 / (self.history_count - 1) as f32) * w;
let vy = y + h - ((v / 80.0) * h);
path.line_to(vx, vy);
}
path.line_to(x + w, y + h);
canvas.fill_path(&mut path, Paint::color(Color::rgba(255, 192, 0, 128)));
let mut text_paint = Paint::color(Color::rgba(240, 240, 240, 255));
text_paint.set_font_size(12.0);
let _ = canvas.fill_text(x + 5.0, y + 13.0, "Frame time", text_paint);
let mut text_paint = Paint::color(Color::rgba(240, 240, 240, 255));
text_paint.set_font_size(14.0);
text_paint.set_text_align(Align::Right);
text_paint.set_text_baseline(Baseline::Top);
let _ = canvas.fill_text(x + w - 5.0, y, &format!("{:.2} FPS", 1.0 / avg), text_paint);
let mut text_paint = Paint::color(Color::rgba(240, 240, 240, 200));
text_paint.set_font_size(12.0);
text_paint.set_text_align(Align::Right);
text_paint.set_text_baseline(Baseline::Alphabetic);
let _ = canvas.fill_text(
x + w - 5.0,
y + h - 5.0,
&format!("{:.2} ms", avg * 1000.0),
text_paint,
);
}
}

File diff suppressed because it is too large Load Diff

11
helix-ui/src/shader.wgsl Normal file
View File

@ -0,0 +1,11 @@
[[stage(vertex)]]
fn vs_main([[builtin(vertex_index)]] in_vertex_index: u32) -> [[builtin(position)]] vec4<f32> {
let x = f32(i32(in_vertex_index) - 1);
let y = f32(i32(in_vertex_index & 1u) * 2 - 1);
return vec4<f32>(x, y, 0.0, 1.0);
}
[[stage(fragment)]]
fn fs_main() -> [[location(0)]] vec4<f32> {
return vec4<f32>(1.0, 0.0, 0.0, 1.0);
}