sync
This commit is contained in:
parent
53d5b6a57f
commit
caf8b68926
546
Cargo.lock
generated
546
Cargo.lock
generated
@ -240,6 +240,12 @@ dependencies = [
|
||||
"rustc-demangle",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.21.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
|
||||
|
||||
[[package]]
|
||||
name = "base64ct"
|
||||
version = "1.6.0"
|
||||
@ -505,6 +511,7 @@ dependencies = [
|
||||
"glue",
|
||||
"gtk4",
|
||||
"image",
|
||||
"imgref",
|
||||
"indexmap",
|
||||
"lazy_static",
|
||||
"libadwaita",
|
||||
@ -524,10 +531,13 @@ dependencies = [
|
||||
"relm4",
|
||||
"relm4-components",
|
||||
"relm4-icons",
|
||||
"reqwest",
|
||||
"rgb",
|
||||
"rstar",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"shapefile",
|
||||
"slippy-map-tiles",
|
||||
"smallvec",
|
||||
"sorted-vec",
|
||||
"surfman",
|
||||
@ -976,6 +986,15 @@ version = "1.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
|
||||
|
||||
[[package]]
|
||||
name = "encoding_rs"
|
||||
version = "0.8.33"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "env_logger"
|
||||
version = "0.9.3"
|
||||
@ -1007,6 +1026,16 @@ version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1"
|
||||
|
||||
[[package]]
|
||||
name = "errno"
|
||||
version = "0.3.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "etws_loader"
|
||||
version = "0.1.0"
|
||||
@ -1050,6 +1079,12 @@ dependencies = [
|
||||
"zune-inflate",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fastrand"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
|
||||
|
||||
[[package]]
|
||||
name = "fdeflate"
|
||||
version = "0.3.4"
|
||||
@ -1183,6 +1218,15 @@ version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
|
||||
|
||||
[[package]]
|
||||
name = "form_urlencoded"
|
||||
version = "1.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
|
||||
dependencies = [
|
||||
"percent-encoding",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fragile"
|
||||
version = "2.0.0"
|
||||
@ -1766,6 +1810,25 @@ dependencies = [
|
||||
"zvariant",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "h2"
|
||||
version = "0.3.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"fnv",
|
||||
"futures-core",
|
||||
"futures-sink",
|
||||
"futures-util",
|
||||
"http",
|
||||
"indexmap",
|
||||
"slab",
|
||||
"tokio",
|
||||
"tokio-util",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "half"
|
||||
version = "2.2.1"
|
||||
@ -1833,12 +1896,83 @@ dependencies = [
|
||||
"digest",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "http"
|
||||
version = "0.2.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"fnv",
|
||||
"itoa",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "http-body"
|
||||
version = "0.4.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"http",
|
||||
"pin-project-lite",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "httparse"
|
||||
version = "1.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
|
||||
|
||||
[[package]]
|
||||
name = "httpdate"
|
||||
version = "1.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
|
||||
|
||||
[[package]]
|
||||
name = "humantime"
|
||||
version = "2.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
|
||||
|
||||
[[package]]
|
||||
name = "hyper"
|
||||
version = "0.14.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"futures-channel",
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"h2",
|
||||
"http",
|
||||
"http-body",
|
||||
"httparse",
|
||||
"httpdate",
|
||||
"itoa",
|
||||
"pin-project-lite",
|
||||
"socket2",
|
||||
"tokio",
|
||||
"tower-service",
|
||||
"tracing",
|
||||
"want",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper-tls"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"hyper",
|
||||
"native-tls",
|
||||
"tokio",
|
||||
"tokio-native-tls",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iana-time-zone"
|
||||
version = "0.1.59"
|
||||
@ -1868,6 +2002,16 @@ version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
|
||||
dependencies = [
|
||||
"unicode-bidi",
|
||||
"unicode-normalization",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "image"
|
||||
version = "0.24.7"
|
||||
@ -1889,9 +2033,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "imgref"
|
||||
version = "1.9.4"
|
||||
version = "1.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b2cf49df1085dcfb171460e4592597b84abe50d900fb83efb6e41b20fefd6c2c"
|
||||
checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126"
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
@ -1936,6 +2080,12 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ipnet"
|
||||
version = "2.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.10.5"
|
||||
@ -2064,9 +2214,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.147"
|
||||
version = "0.2.153"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
|
||||
checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
|
||||
|
||||
[[package]]
|
||||
name = "libloading"
|
||||
@ -2116,6 +2266,12 @@ dependencies = [
|
||||
"redox_syscall 0.4.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
version = "0.4.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
version = "0.4.10"
|
||||
@ -2222,6 +2378,12 @@ dependencies = [
|
||||
"objc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mime"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
||||
|
||||
[[package]]
|
||||
name = "minimal-lexical"
|
||||
version = "0.2.1"
|
||||
@ -2240,9 +2402,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "mio"
|
||||
version = "0.8.8"
|
||||
version = "0.8.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
|
||||
checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"log",
|
||||
@ -2259,6 +2421,24 @@ dependencies = [
|
||||
"getrandom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "native-tls"
|
||||
version = "0.2.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
|
||||
dependencies = [
|
||||
"lazy_static",
|
||||
"libc",
|
||||
"log",
|
||||
"openssl",
|
||||
"openssl-probe",
|
||||
"openssl-sys",
|
||||
"schannel",
|
||||
"security-framework",
|
||||
"security-framework-sys",
|
||||
"tempfile",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ndarray"
|
||||
version = "0.15.6"
|
||||
@ -2622,6 +2802,50 @@ version = "1.19.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
||||
|
||||
[[package]]
|
||||
name = "openssl"
|
||||
version = "0.10.64"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f"
|
||||
dependencies = [
|
||||
"bitflags 2.3.3",
|
||||
"cfg-if",
|
||||
"foreign-types",
|
||||
"libc",
|
||||
"once_cell",
|
||||
"openssl-macros",
|
||||
"openssl-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openssl-macros"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.76",
|
||||
"quote 1.0.35",
|
||||
"syn 2.0.48",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "openssl-probe"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
|
||||
|
||||
[[package]]
|
||||
name = "openssl-sys"
|
||||
version = "0.9.101"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"libc",
|
||||
"pkg-config",
|
||||
"vcpkg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "option-ext"
|
||||
version = "0.2.0"
|
||||
@ -3237,10 +3461,50 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rgb"
|
||||
version = "0.8.36"
|
||||
name = "reqwest"
|
||||
version = "0.11.25"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "20ec2d3e3fc7a92ced357df9cebd5a10b6fb2aa1ee797bf7e9ce2f17dffc8f59"
|
||||
checksum = "0eea5a9eb898d3783f17c6407670e3592fd174cb81a10e51d4c37f49450b9946"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"bytes",
|
||||
"encoding_rs",
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"h2",
|
||||
"http",
|
||||
"http-body",
|
||||
"hyper",
|
||||
"hyper-tls",
|
||||
"ipnet",
|
||||
"js-sys",
|
||||
"log",
|
||||
"mime",
|
||||
"native-tls",
|
||||
"once_cell",
|
||||
"percent-encoding",
|
||||
"pin-project-lite",
|
||||
"rustls-pemfile",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_urlencoded",
|
||||
"sync_wrapper",
|
||||
"system-configuration",
|
||||
"tokio",
|
||||
"tokio-native-tls",
|
||||
"tower-service",
|
||||
"url",
|
||||
"wasm-bindgen",
|
||||
"wasm-bindgen-futures",
|
||||
"web-sys",
|
||||
"winreg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rgb"
|
||||
version = "0.8.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
]
|
||||
@ -3283,6 +3547,28 @@ dependencies = [
|
||||
"semver",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "0.38.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f"
|
||||
dependencies = [
|
||||
"bitflags 2.3.3",
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustls-pemfile"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
|
||||
dependencies = [
|
||||
"base64",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.14"
|
||||
@ -3326,6 +3612,15 @@ dependencies = [
|
||||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "schannel"
|
||||
version = "0.1.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
|
||||
dependencies = [
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "scoped-tls"
|
||||
version = "1.0.1"
|
||||
@ -3351,6 +3646,29 @@ dependencies = [
|
||||
"tiny-skia",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "security-framework"
|
||||
version = "2.9.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de"
|
||||
dependencies = [
|
||||
"bitflags 1.3.2",
|
||||
"core-foundation",
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
"security-framework-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "security-framework-sys"
|
||||
version = "2.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "semver"
|
||||
version = "1.0.17"
|
||||
@ -3397,6 +3715,18 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_urlencoded"
|
||||
version = "0.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
|
||||
dependencies = [
|
||||
"form_urlencoded",
|
||||
"itoa",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "servo-display-link"
|
||||
version = "0.2.0"
|
||||
@ -3468,6 +3798,15 @@ version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook-registry"
|
||||
version = "1.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "simd-adler32"
|
||||
version = "0.3.7"
|
||||
@ -3483,6 +3822,16 @@ dependencies = [
|
||||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "slippy-map-tiles"
|
||||
version = "0.16.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7ca0bb81e6365882ec0e68a114f08c1c126d1fca2faafee1c82d2d95b0f07099"
|
||||
dependencies = [
|
||||
"lazy_static",
|
||||
"regex",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "slotmap"
|
||||
version = "1.0.6"
|
||||
@ -3517,6 +3866,16 @@ dependencies = [
|
||||
"wayland-protocols",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "socket2"
|
||||
version = "0.5.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sorted-vec"
|
||||
version = "0.8.3"
|
||||
@ -3636,6 +3995,33 @@ dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sync_wrapper"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
|
||||
|
||||
[[package]]
|
||||
name = "system-configuration"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "658bc6ee10a9b4fcf576e9b0819d95ec16f4d2c02d39fd83ac1c8789785c4a42"
|
||||
dependencies = [
|
||||
"bitflags 2.3.3",
|
||||
"core-foundation",
|
||||
"system-configuration-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "system-configuration-sys"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "system-deps"
|
||||
version = "6.1.1"
|
||||
@ -3666,6 +4052,19 @@ version = "0.12.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1b1c7f239eb94671427157bd93b3694320f3668d4e1eff08c7285366fd777fac"
|
||||
|
||||
[[package]]
|
||||
name = "tempfile"
|
||||
version = "3.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"fastrand",
|
||||
"redox_syscall 0.3.5",
|
||||
"rustix",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "termcolor"
|
||||
version = "1.2.0"
|
||||
@ -3773,16 +4172,37 @@ dependencies = [
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio"
|
||||
version = "1.35.1"
|
||||
name = "tinyvec"
|
||||
version = "1.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
|
||||
checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
|
||||
dependencies = [
|
||||
"tinyvec_macros",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tinyvec_macros"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
||||
|
||||
[[package]]
|
||||
name = "tokio"
|
||||
version = "1.36.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931"
|
||||
dependencies = [
|
||||
"backtrace",
|
||||
"bytes",
|
||||
"libc",
|
||||
"mio",
|
||||
"num_cpus",
|
||||
"parking_lot",
|
||||
"pin-project-lite",
|
||||
"signal-hook-registry",
|
||||
"socket2",
|
||||
"tokio-macros",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -3805,6 +4225,30 @@ dependencies = [
|
||||
"syn 2.0.48",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-native-tls"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
|
||||
dependencies = [
|
||||
"native-tls",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-util"
|
||||
version = "0.7.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"futures-core",
|
||||
"futures-sink",
|
||||
"pin-project-lite",
|
||||
"tokio",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "0.7.5"
|
||||
@ -3876,6 +4320,12 @@ dependencies = [
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tower-service"
|
||||
version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
|
||||
|
||||
[[package]]
|
||||
name = "tracing"
|
||||
version = "0.1.40"
|
||||
@ -3953,6 +4403,12 @@ dependencies = [
|
||||
"syn 2.0.48",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "try-lock"
|
||||
version = "0.2.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
|
||||
|
||||
[[package]]
|
||||
name = "tstr"
|
||||
version = "0.2.3"
|
||||
@ -4034,6 +4490,15 @@ version = "1.0.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-normalization"
|
||||
version = "0.1.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5"
|
||||
dependencies = [
|
||||
"tinyvec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-script"
|
||||
version = "0.5.5"
|
||||
@ -4058,12 +4523,29 @@ version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
|
||||
|
||||
[[package]]
|
||||
name = "url"
|
||||
version = "2.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
|
||||
dependencies = [
|
||||
"form_urlencoded",
|
||||
"idna",
|
||||
"percent-encoding",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "valuable"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
|
||||
|
||||
[[package]]
|
||||
name = "vcpkg"
|
||||
version = "0.2.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
|
||||
|
||||
[[package]]
|
||||
name = "vec_map"
|
||||
version = "0.8.2"
|
||||
@ -4092,6 +4574,15 @@ dependencies = [
|
||||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "want"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
|
||||
dependencies = [
|
||||
"try-lock",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.11.0+wasi-snapshot-preview1"
|
||||
@ -4123,6 +4614,18 @@ dependencies = [
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-futures"
|
||||
version = "0.4.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"js-sys",
|
||||
"wasm-bindgen",
|
||||
"web-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro"
|
||||
version = "0.2.87"
|
||||
@ -4322,6 +4825,15 @@ dependencies = [
|
||||
"windows-targets 0.48.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
|
||||
dependencies = [
|
||||
"windows-targets 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-targets"
|
||||
version = "0.42.2"
|
||||
@ -4546,6 +5058,16 @@ dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winreg"
|
||||
version = "0.50.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wio"
|
||||
version = "0.2.2"
|
||||
|
||||
23
Cargo.toml
23
Cargo.toml
@ -42,15 +42,16 @@ core_extensions = { version = "1.5.2", default_features = false, features = [
|
||||
"std",
|
||||
] }
|
||||
plotters-backend = "0.3.5"
|
||||
tokio = { version = "1.35.1", features = [
|
||||
"time",
|
||||
"fs",
|
||||
"io-std",
|
||||
"macros",
|
||||
"num_cpus",
|
||||
"bytes",
|
||||
"io-util",
|
||||
] }
|
||||
#tokio = { version = "1.35.1", features = [
|
||||
# "time",
|
||||
# "fs",
|
||||
# "io-std",
|
||||
# "macros",
|
||||
# "num_cpus",
|
||||
# "bytes",
|
||||
# "io-util",
|
||||
#] }
|
||||
tokio = { version = "1.36.0", features = ["full"] }
|
||||
async-trait = "0.1.77"
|
||||
lazy_static = "1.4.0"
|
||||
once_cell = "1.19.0"
|
||||
@ -87,6 +88,10 @@ tracing = "0.1.40"
|
||||
tracing-subscriber = "0.3.18"
|
||||
indexmap = "2.2.2"
|
||||
tokio-condvar = "0.1.0"
|
||||
imgref = "1.10.1"
|
||||
rgb = "0.8.37"
|
||||
slippy-map-tiles = "0.16.0"
|
||||
reqwest = "0.11.25"
|
||||
|
||||
|
||||
[build-dependencies]
|
||||
|
||||
@ -33,6 +33,8 @@ impl Plugin for ETWSLoader {
|
||||
}
|
||||
|
||||
fn load(&self, path: RStr<'_>) -> RResult<PluginResult, Error> where {
|
||||
let mut lat_range = [0.0, 0.0];
|
||||
let mut lon_range = [0.0, 0.0];
|
||||
if let Ok(record) = Record::parse_from_path(path.to_string()) {
|
||||
let result_blocks = record
|
||||
.blocks
|
||||
@ -87,6 +89,11 @@ impl Plugin for ETWSLoader {
|
||||
CoordType::Other
|
||||
};
|
||||
|
||||
let lat = b.info.dimension_values.get(0).unwrap();
|
||||
let lon = b.info.dimension_values.get(1).unwrap();
|
||||
lat_range = [lat[0], lat[lat.len() - 1]];
|
||||
lon_range = [lon[0], lon[lon.len() - 1]];
|
||||
|
||||
let shape = match b.info.dimension_size.len() {
|
||||
1 => radarg_plugin_interface::DataShape::Vector,
|
||||
2 => radarg_plugin_interface::DataShape::Matrix,
|
||||
@ -137,8 +144,8 @@ impl Plugin for ETWSLoader {
|
||||
let meta = MetaData {
|
||||
datetime: RSome(record.filetime.timestamp()),
|
||||
site_info: RNone,
|
||||
lon_range: RSome([0.0, 0.0]),
|
||||
lat_range: RSome([1.0, 1.0]),
|
||||
lon_range: RSome(lon_range),
|
||||
lat_range: RSome(lat_range),
|
||||
data_format: RSome("Eastone Washon Radar".into()),
|
||||
other_info: RNone,
|
||||
};
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{"$message_type":"diagnostic","message":"unused imports: `Write`, `self`","code":{"code":"unused_imports","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":323,"byte_end":327,"line_start":13,"line_end":13,"column_start":15,"column_end":19,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":19}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":335,"byte_end":340,"line_start":13,"line_end":13,"column_start":27,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":27,"highlight_end":32}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_imports)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"remove the unused imports","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":323,"byte_end":329,"line_start":13,"line_end":13,"column_start":15,"column_end":21,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":15,"highlight_end":21}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null},{"file_name":"src/parser.rs","byte_start":333,"byte_end":340,"line_start":13,"line_end":13,"column_start":25,"column_end":32,"is_primary":true,"text":[{"text":"use std::io::{self, Read, Write};","highlight_start":25,"highlight_end":32}],"label":null,"suggested_replacement":"","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused imports: `Write`, `self`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:13:15\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m13\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0muse std::io::{self, Read, Write};\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_imports)]` on by default\u001b[0m\n\n"}
|
||||
{"$message_type":"diagnostic","message":"unused variable: `hlen2`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":6651,"byte_end":6656,"line_start":198,"line_end":198,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(unused_variables)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":6651,"byte_end":6656,"line_start":198,"line_end":198,"column_start":21,"column_end":26,"is_primary":true,"text":[{"text":" let (input, hlen2) = Self::_parse_u32(input, order)?;","highlight_start":21,"highlight_end":26}],"label":null,"suggested_replacement":"_hlen2","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:198:21\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m198\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (input, hlen2) = Self::_parse_u32(input, order)?;\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_hlen2`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(unused_variables)]` on by default\u001b[0m\n\n"}
|
||||
{"$message_type":"diagnostic","message":"unused variable: `order`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":9035,"byte_end":9040,"line_start":279,"line_end":279,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/parser.rs","byte_start":9035,"byte_end":9040,"line_start":279,"line_end":279,"column_start":9,"column_end":14,"is_primary":true,"text":[{"text":" order: Order,","highlight_start":9,"highlight_end":14}],"label":null,"suggested_replacement":"_order","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `order`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:279:9\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m279\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m order: Order,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_order`\u001b[0m\n\n"}
|
||||
{"$message_type":"diagnostic","message":"unused variable: `dimension_len`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/lib.rs","byte_start":1029,"byte_end":1042,"line_start":41,"line_end":41,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/lib.rs","byte_start":1029,"byte_end":1042,"line_start":41,"line_end":41,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":"_dimension_len","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `dimension_len`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:41:26\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m41\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (dimension_len, data) = match b.data {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_dimension_len`\u001b[0m\n\n"}
|
||||
{"$message_type":"diagnostic","message":"unused variable: `dimension_len`","code":{"code":"unused_variables","explanation":null},"level":"warning","spans":[{"file_name":"src/lib.rs","byte_start":1109,"byte_end":1122,"line_start":43,"line_end":43,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"if this is intentional, prefix it with an underscore","code":null,"level":"help","spans":[{"file_name":"src/lib.rs","byte_start":1109,"byte_end":1122,"line_start":43,"line_end":43,"column_start":26,"column_end":39,"is_primary":true,"text":[{"text":" let (dimension_len, data) = match b.data {","highlight_start":26,"highlight_end":39}],"label":null,"suggested_replacement":"_dimension_len","suggestion_applicability":"MachineApplicable","expansion":null}],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: unused variable: `dimension_len`\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/lib.rs:43:26\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m43\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m let (dimension_len, data) = match b.data {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^^^^^^^^^^^\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33mhelp: if this is intentional, prefix it with an underscore: `_dimension_len`\u001b[0m\n\n"}
|
||||
{"$message_type":"diagnostic","message":"variants `I64` and `U64` are never constructed","code":{"code":"dead_code","explanation":null},"level":"warning","spans":[{"file_name":"src/parser.rs","byte_start":563,"byte_end":573,"line_start":28,"line_end":28,"column_start":6,"column_end":16,"is_primary":false,"text":[{"text":"enum ValueTypes {","highlight_start":6,"highlight_end":16}],"label":"variants in this enum","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":580,"byte_end":583,"line_start":29,"line_end":29,"column_start":5,"column_end":8,"is_primary":true,"text":[{"text":" I64,","highlight_start":5,"highlight_end":8}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src/parser.rs","byte_start":616,"byte_end":619,"line_start":33,"line_end":33,"column_start":5,"column_end":8,"is_primary":true,"text":[{"text":" U64,","highlight_start":5,"highlight_end":8}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`#[warn(dead_code)]` on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null}],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: variants `I64` and `U64` are never constructed\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m--> \u001b[0m\u001b[0msrc/parser.rs:29:5\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m28\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0menum ValueTypes {\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m----------\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12mvariants in this enum\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m29\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m I64,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m...\u001b[0m\n\u001b[0m\u001b[1m\u001b[38;5;12m33\u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\u001b[0m \u001b[0m\u001b[0m U64,\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m| \u001b[0m\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[33m^^^\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m|\u001b[0m\n\u001b[0m \u001b[0m\u001b[0m\u001b[1m\u001b[38;5;12m= \u001b[0m\u001b[0m\u001b[1mnote\u001b[0m\u001b[0m: `#[warn(dead_code)]` on by default\u001b[0m\n\n"}
|
||||
{"$message_type":"diagnostic","message":"5 warnings emitted","code":null,"level":"warning","spans":[],"children":[],"rendered":"\u001b[0m\u001b[1m\u001b[33mwarning\u001b[0m\u001b[0m\u001b[1m: 5 warnings emitted\u001b[0m\n\n"}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -222,6 +222,8 @@ impl Component for AppModel {
|
||||
*FILE_PATH_ROOT.lock().unwrap() = path.clone();
|
||||
let data = Self::open_file_only(path);
|
||||
let meta: MetaInfo = (&data.meta).clone().into();
|
||||
let (lat_start, lat_end) = meta.lat_range.unwrap();
|
||||
let (lon_start, lon_end) = meta.lon_range.unwrap();
|
||||
let element_impl = plugin_result_impl(&data);
|
||||
let mut renderer = OffscreenRenderer::new(3000, 3000).unwrap();
|
||||
let mut canvas = renderer.create_canvas();
|
||||
@ -238,6 +240,9 @@ impl Component for AppModel {
|
||||
let layer =
|
||||
Layer::new(true, "New Layer".to_string(), AssoElement::Instant(element));
|
||||
dialog_render_sender.emit(MonitorInputMsg::AddMetaItem(meta.to_map()));
|
||||
dialog_render_sender.emit(MonitorInputMsg::SetRenderRange(
|
||||
lon_start, lon_end, lat_start, lat_end,
|
||||
));
|
||||
AppMsg::NewLayer(layer)
|
||||
}
|
||||
_ => AppMsg::Close,
|
||||
|
||||
@ -67,11 +67,6 @@ impl SimpleComponent for ControlPanelModel {
|
||||
println!("Selected: {}", step_selector.selected());
|
||||
},
|
||||
}
|
||||
// gtk::Label{
|
||||
// set_label: "Subheader",
|
||||
// add_css_class:"h3",
|
||||
// set_halign: gtk::Align::Start,
|
||||
// }
|
||||
},
|
||||
#[local]
|
||||
step_selector -> gtk::DropDown{
|
||||
|
||||
@ -17,12 +17,14 @@ pub enum MonitorInputMsg {
|
||||
UpdateMetaItem(HashMap<String, String>),
|
||||
UpdateLayer((String, Box<dyn Fn(&mut Layer) + 'static>)),
|
||||
RefreshLayerList,
|
||||
SetRenderRange(f64, f64, f64, f64),
|
||||
None,
|
||||
}
|
||||
|
||||
impl Debug for MonitorInputMsg {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
match self {
|
||||
MonitorInputMsg::SetRenderRange(_, _, _, _) => write!(f, "MonitorInputMsg::SetRenderRange"),
|
||||
MonitorInputMsg::RefreshLayerList => write!(f, "MonitorInputMsg::RefreshLayerList"),
|
||||
MonitorInputMsg::NewElement(_) => write!(f, "MonitorInputMsg::NewElement"),
|
||||
MonitorInputMsg::AddLayer(_) => write!(f, "MonitorInputMsg::AddLayer"),
|
||||
|
||||
@ -79,8 +79,6 @@ impl Component for MonitorModel {
|
||||
#[name = "renderer"]
|
||||
#[wrap(Some)]
|
||||
set_child = &Render{
|
||||
// #[track = "model.changed(MonitorModel::new_layer())"]
|
||||
// set_interior_layers: model.layers.clone(),
|
||||
#[track = "model.changed(MonitorModel::render_cfg())"]
|
||||
set_cfg: model.render_cfg,
|
||||
#[track = "model.changed(MonitorModel::render_range())"]
|
||||
@ -110,7 +108,6 @@ impl Component for MonitorModel {
|
||||
}
|
||||
|
||||
fn update_with_view(&mut self, widgets: &mut Self::Widgets, message: Self::Input, sender: ComponentSender<Self>, root: &Self::Root) {
|
||||
|
||||
self.reset();
|
||||
match message {
|
||||
MonitorInputMsg::AddLayer(layer) => {
|
||||
@ -126,6 +123,9 @@ impl Component for MonitorModel {
|
||||
MonitorInputMsg::AddMetaItem(map) => {
|
||||
self.sidebar.emit(SideBarInputMsg::AddMetaItems(map))
|
||||
}
|
||||
MonitorInputMsg::SetRenderRange(lon_start,lon_end,lat_start,lat_end)=>{
|
||||
self.set_render_range((lat_start,lat_end,lon_start,lon_end));
|
||||
}
|
||||
MonitorInputMsg::ClearMetaItems => self.sidebar.emit(SideBarInputMsg::ClearMetaItems),
|
||||
MonitorInputMsg::UpdateMetaItem(map) => {
|
||||
self.sidebar.emit(SideBarInputMsg::ClearMetaItems);
|
||||
@ -193,16 +193,6 @@ impl Component for MonitorModel {
|
||||
) {
|
||||
self.reset();
|
||||
match msg {
|
||||
// MonitorCommand::NewLayer(layer) => {
|
||||
// // self.layers.borrow_mut().insert(layer.name.clone(), layer);
|
||||
// // self.set_render_range((29.13, 30.16, 119.53, 121.13));
|
||||
// // self.sidebar
|
||||
// // .sender()
|
||||
// // .send(SideBarInputMsg::RefreshList)
|
||||
// // .unwrap();
|
||||
// // let raw_id = self.get_new_layer();
|
||||
// // self.set_new_layer(*raw_id + 1);
|
||||
// }
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
6
src/components/monitor/sidebar/actions.rs
Normal file
6
src/components/monitor/sidebar/actions.rs
Normal file
@ -0,0 +1,6 @@
|
||||
use crate::widgets::Layer;
|
||||
|
||||
relm4::safe_settings_and_actions! {
|
||||
#[derive(Debug)]
|
||||
pub(super) Visible(group: "layer", name: "layer-visible");
|
||||
}
|
||||
@ -2,3 +2,4 @@ pub mod sidebar;
|
||||
pub use sidebar::*;
|
||||
pub mod bottom_bar;
|
||||
pub mod meta_data_list;
|
||||
mod actions;
|
||||
|
||||
@ -1,8 +1,11 @@
|
||||
use abi_stable::type_level::trait_marker::Hash;
|
||||
use relm4::safe_settings_and_actions::extensions::SafeSimpleAction;
|
||||
use super::actions::*;
|
||||
use glib::clone;
|
||||
use gtk::prelude::WidgetExt;
|
||||
use gtk::prelude::*;
|
||||
use relm4::{
|
||||
gtk::gio,
|
||||
binding::{Binding, U8Binding},
|
||||
factory::{DynamicIndex, FactoryComponent, FactorySender, FactoryVecDeque},
|
||||
prelude::*,
|
||||
@ -26,11 +29,9 @@ use super::{
|
||||
meta_data_list::{InfoColumn, MyListItem, TagColumn},
|
||||
};
|
||||
|
||||
relm4::new_action_group!(LayerActionGroup, "layer");
|
||||
relm4::new_stateful_action!(ToTime, LayerActionGroup, "to_time", u32, ());
|
||||
relm4::new_stateless_action!(BeTime, LayerActionGroup, "be_time");
|
||||
pub struct SideBarModel {
|
||||
layers: Rc<RefCell<Vec<Layer>>>,
|
||||
selected_layer_idx: usize,
|
||||
counter: u8,
|
||||
list_view_wrapper: TypedListView<LayerItem, gtk::SingleSelection>,
|
||||
bottom_bar_vec: FactoryVecDeque<BottomBarModel>,
|
||||
@ -93,8 +94,7 @@ impl SimpleComponent for SideBarModel {
|
||||
set_spacing: 5,
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
}
|
||||
},
|
||||
layer_page = gtk::ScrolledWindow::builder()
|
||||
.vexpand(true)
|
||||
@ -132,24 +132,9 @@ impl SimpleComponent for SideBarModel {
|
||||
// Initialize the ListView wrapper
|
||||
let mut list_view_wrapper: TypedListView<LayerItem, gtk::SingleSelection> =
|
||||
TypedListView::with_sorting();
|
||||
|
||||
let mut bottom_bar_vec = FactoryVecDeque::new(gtk::Box::default(), sender.input_sender());
|
||||
|
||||
let mut group = relm4::actions::RelmActionGroup::<LayerActionGroup>::new();
|
||||
let action: RelmAction<ToTime> = {
|
||||
RelmAction::new_stateful_with_target_value(&(), move |_, state, _value| {
|
||||
sender.output(SideBarOutputMsg::SwitchToTimeSeries(_value as usize)).unwrap()
|
||||
})
|
||||
};
|
||||
|
||||
let action2:RelmAction<BeTime> = RelmAction::new_stateless(|_| {
|
||||
dbg!("be time");
|
||||
});
|
||||
|
||||
group.add_action(action);
|
||||
group.add_action(action2);
|
||||
let app = relm4::main_application();
|
||||
group.register_for_widget(root);
|
||||
|
||||
{
|
||||
let mut bottom_bar_vec_guard = bottom_bar_vec.guard();
|
||||
@ -165,6 +150,7 @@ impl SimpleComponent for SideBarModel {
|
||||
let mut model = SideBarModel {
|
||||
meta_list_view,
|
||||
layers: init,
|
||||
selected_layer_idx: 0,
|
||||
counter: 0,
|
||||
list_view_wrapper,
|
||||
bottom_bar_vec,
|
||||
@ -269,8 +255,6 @@ impl RelmListItem for LayerItem {
|
||||
fn setup(_item: >k::ListItem) -> (gtk::Box, Widgets) {
|
||||
relm4::menu! {
|
||||
main_menu: {
|
||||
"Bind To Time" => ToTime(0),
|
||||
"Be Time" => BeTime,
|
||||
}
|
||||
}
|
||||
|
||||
@ -326,8 +310,6 @@ impl RelmListItem for LayerItem {
|
||||
|
||||
relm4::menu! {
|
||||
main_menu: {
|
||||
"Bind To Time" => ToTime(self.key),
|
||||
"Be Time" => BeTime,
|
||||
}
|
||||
}
|
||||
menu.set_menu_model(Some(&main_menu));
|
||||
|
||||
@ -26,6 +26,8 @@ use tracing::info;
|
||||
use tracing_subscriber;
|
||||
mod widgets;
|
||||
mod data_utils;
|
||||
mod predefined;
|
||||
mod map_tile_utils;
|
||||
|
||||
const APP_ID: &str = "org.tsuki.radar_g";
|
||||
static RUNTIME: SafeLazy<Runtime> =
|
||||
|
||||
9
src/map_tile_utils.rs
Normal file
9
src/map_tile_utils.rs
Normal file
@ -0,0 +1,9 @@
|
||||
|
||||
pub fn lat_lon_to_zoom(lat_range: (f64, f64), lon_range: (f64, f64), w: f32, h:f32 ) -> u8 {
|
||||
let lat_diff = lat_range.1 - lat_range.0;
|
||||
let lon_diff = lon_range.1 - lon_range.0;
|
||||
let z1 = ( (360.0 * w) as f64 / lon_diff / 256.0).log2();
|
||||
let z2 = ( (180.0 * h) as f64 / lat_diff / 256.0).log2();
|
||||
let z = z1.min(z2);
|
||||
z as u8
|
||||
}
|
||||
@ -9,7 +9,8 @@ use crate::RUNTIME;
|
||||
use crate::{coords::Range, widgets::widget::Widget};
|
||||
use chrono::{DateTime, TimeZone, Utc};
|
||||
use core_extensions::SelfOps;
|
||||
use femtovg::{renderer::OpenGl, Canvas, ImageId};
|
||||
use femtovg::rgb::alt::GRAY8;
|
||||
use femtovg::{renderer::OpenGl, Canvas, ImageFlags, ImageId, ImageInfo, PixelFormat};
|
||||
use futures::StreamExt;
|
||||
use glib::PropertyGet;
|
||||
use radarg_plugin_interface::PluginResult;
|
||||
@ -149,8 +150,15 @@ impl InstantElement {
|
||||
let result_id = match target.target {
|
||||
TargetType::ImageId(id) => id,
|
||||
TargetType::Mem(ref mem) => {
|
||||
let gl_bind = render.get_context();
|
||||
let gl = gl_bind.as_ref().unwrap();
|
||||
let flags = ImageFlags::empty();
|
||||
let texture = target.mem_to_native_texture(gl, flags);
|
||||
let converted = canvas
|
||||
.load_image_mem(mem, femtovg::ImageFlags::empty())
|
||||
.create_image_from_native_texture(
|
||||
texture,
|
||||
ImageInfo::new(flags, 3000, 3000, PixelFormat::Rgba8),
|
||||
)
|
||||
.unwrap();
|
||||
target.set_target(TargetType::ImageId(converted));
|
||||
converted
|
||||
@ -168,17 +176,25 @@ impl InstantElement {
|
||||
pub fn to_time_series(
|
||||
self,
|
||||
dispatcher: Rc<Dispatcher>,
|
||||
cms:CMS
|
||||
cms: CMS,
|
||||
) -> (TimeSeriesElement, DateTime<Utc>) {
|
||||
// let imp = Arc::new(InstantElementImpl::new(self));
|
||||
if let InstantElementDrawerType::Prepared((target, imp)) = self.draw_type {
|
||||
let mut time_series = TimeSeriesElement::new(imp, dispatcher, cms, self.key);
|
||||
let data = target.data.clone().unwrap().downcast::<PluginResult>().unwrap();
|
||||
let data = target
|
||||
.data
|
||||
.clone()
|
||||
.unwrap()
|
||||
.downcast::<PluginResult>()
|
||||
.unwrap();
|
||||
let time_stamp = data.blocks.first().unwrap().datetime;
|
||||
let meta_info: MetaInfo = data.meta.clone().into();
|
||||
use chrono::prelude::*;
|
||||
let time = Utc.timestamp_opt(time_stamp, 0).unwrap();
|
||||
(*time_series.buffer).lock().unwrap().insert(time, Some(RenderResult::new(target, meta_info)));
|
||||
(*time_series.buffer)
|
||||
.lock()
|
||||
.unwrap()
|
||||
.insert(time, Some(RenderResult::new(target, meta_info)));
|
||||
(time_series, time)
|
||||
} else {
|
||||
panic!("InstantElementDrawerType is not prepared");
|
||||
@ -294,15 +310,11 @@ impl TimeSeriesElement {
|
||||
}
|
||||
|
||||
{
|
||||
registers
|
||||
.lock()
|
||||
.unwrap()
|
||||
.get_mut(&dt)
|
||||
.map(|x|x.into_iter()
|
||||
.for_each(|n| {
|
||||
registers.lock().unwrap().get_mut(&dt).map(|x| {
|
||||
x.into_iter().for_each(|n| {
|
||||
n.notify_waiters();
|
||||
}) )
|
||||
;
|
||||
})
|
||||
});
|
||||
}
|
||||
})
|
||||
});
|
||||
@ -383,6 +395,115 @@ impl Target {
|
||||
((x2 - x1).abs(), (y2 - y1).abs())
|
||||
}
|
||||
|
||||
pub fn mem_to_native_texture(&self, gl: &glow::Context, flags: ImageFlags) -> glow::NativeTexture {
|
||||
if let TargetType::Mem(ref mem) = self.target{
|
||||
use glow::*;
|
||||
let texture = unsafe {
|
||||
let id = gl.create_texture().unwrap();
|
||||
gl.bind_texture(glow::TEXTURE_2D, Some(id));
|
||||
gl.pixel_store_i32(glow::UNPACK_ALIGNMENT, 1);
|
||||
gl.pixel_store_i32(glow::UNPACK_ROW_LENGTH, 3000 as i32);
|
||||
gl.pixel_store_i32(glow::UNPACK_SKIP_PIXELS, 0);
|
||||
gl.pixel_store_i32(glow::UNPACK_SKIP_ROWS, 0);
|
||||
id
|
||||
};
|
||||
let width = 3000; // 纹理宽度
|
||||
let height = 3000; // 纹理高度
|
||||
unsafe {
|
||||
gl.tex_image_2d(
|
||||
glow::TEXTURE_2D,
|
||||
0, // level
|
||||
glow::RGBA as i32, // internal_format
|
||||
width,
|
||||
height,
|
||||
0, // border
|
||||
glow::RGBA, // format
|
||||
glow::UNSIGNED_BYTE, // type
|
||||
Some(&mem), // pixels
|
||||
);
|
||||
}
|
||||
|
||||
if flags.contains(ImageFlags::GENERATE_MIPMAPS) {
|
||||
if flags.contains(ImageFlags::NEAREST) {
|
||||
unsafe {
|
||||
gl.tex_parameter_i32(
|
||||
glow::TEXTURE_2D,
|
||||
glow::TEXTURE_MIN_FILTER,
|
||||
glow::NEAREST_MIPMAP_NEAREST as i32,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
unsafe {
|
||||
gl.tex_parameter_i32(
|
||||
glow::TEXTURE_2D,
|
||||
glow::TEXTURE_MIN_FILTER,
|
||||
glow::LINEAR_MIPMAP_LINEAR as i32,
|
||||
);
|
||||
}
|
||||
}
|
||||
} else if flags.contains(ImageFlags::NEAREST) {
|
||||
unsafe {
|
||||
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MIN_FILTER, glow::NEAREST as i32);
|
||||
}
|
||||
} else {
|
||||
unsafe {
|
||||
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MIN_FILTER, glow::LINEAR as i32);
|
||||
}
|
||||
}
|
||||
|
||||
if flags.contains(ImageFlags::NEAREST) {
|
||||
unsafe {
|
||||
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MAG_FILTER, glow::NEAREST as i32);
|
||||
}
|
||||
} else {
|
||||
unsafe {
|
||||
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_MAG_FILTER, glow::LINEAR as i32);
|
||||
}
|
||||
}
|
||||
|
||||
if flags.contains(ImageFlags::REPEAT_X) {
|
||||
unsafe {
|
||||
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, glow::REPEAT as i32);
|
||||
}
|
||||
} else {
|
||||
unsafe {
|
||||
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_S, glow::CLAMP_TO_EDGE as i32);
|
||||
}
|
||||
}
|
||||
|
||||
if flags.contains(ImageFlags::REPEAT_Y) {
|
||||
unsafe {
|
||||
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, glow::REPEAT as i32);
|
||||
}
|
||||
} else {
|
||||
unsafe {
|
||||
gl.tex_parameter_i32(glow::TEXTURE_2D, glow::TEXTURE_WRAP_T, glow::CLAMP_TO_EDGE as i32);
|
||||
}
|
||||
}
|
||||
|
||||
unsafe {
|
||||
gl.pixel_store_i32(glow::UNPACK_ALIGNMENT, 4);
|
||||
gl.pixel_store_i32(glow::UNPACK_ROW_LENGTH, 0);
|
||||
gl.pixel_store_i32(glow::UNPACK_SKIP_PIXELS, 0);
|
||||
gl.pixel_store_i32(glow::UNPACK_SKIP_ROWS, 0);
|
||||
}
|
||||
|
||||
if flags.contains(ImageFlags::GENERATE_MIPMAPS) {
|
||||
unsafe {
|
||||
gl.generate_mipmap(glow::TEXTURE_2D);
|
||||
}
|
||||
}
|
||||
|
||||
unsafe {
|
||||
gl.bind_texture(glow::TEXTURE_2D, None);
|
||||
}
|
||||
|
||||
return texture;
|
||||
} else {
|
||||
panic!("Target is not mem");
|
||||
}
|
||||
}
|
||||
|
||||
pub fn origin(&self, cms: &Render) -> (f32, f32) {
|
||||
let (x, y) = self.bounds;
|
||||
let p1 = (x.0, y.1);
|
||||
|
||||
@ -14,6 +14,7 @@ use ndarray::ArrayView2;
|
||||
use num_traits::{AsPrimitive, FromPrimitive, Num, NumOps};
|
||||
use std::{fmt::Debug, io::Cursor, marker::PhantomData};
|
||||
use gtk::ResponseType::No;
|
||||
use tracing::info;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct GridFieldRenderer<CMAP, T>
|
||||
@ -60,14 +61,14 @@ impl<T: NumOps + PartialOrd + Copy + FromPrimitive + AsPrimitive<f64>, CMAP: Col
|
||||
|
||||
let rt_lat = dim2[[r + 1, c + 1]];
|
||||
let rt_lon = dim1[[r + 1, c + 1]];
|
||||
let cell: LineString = vec![
|
||||
(lb_lon, lb_lat),
|
||||
(rt_lon + 0.001, lb_lat),
|
||||
(rt_lon + 0.001, rt_lat),
|
||||
(lb_lon, rt_lat + 0.001),
|
||||
(lb_lon, lb_lat + 0.001),
|
||||
]
|
||||
.into();
|
||||
// let cell: LineString = vec![
|
||||
// (lb_lon, lb_lat),
|
||||
// (rt_lon + 0.001, lb_lat),
|
||||
// (rt_lon + 0.001, rt_lat),
|
||||
// (lb_lon, rt_lat + 0.001),
|
||||
// (lb_lon, lb_lat + 0.001),
|
||||
// ]
|
||||
// .into();
|
||||
|
||||
let v = &data[[r, c]];
|
||||
let mapped_color = self.cmap.map_value_to_color(*v, fill_value);
|
||||
@ -76,17 +77,20 @@ impl<T: NumOps + PartialOrd + Copy + FromPrimitive + AsPrimitive<f64>, CMAP: Col
|
||||
continue;
|
||||
}
|
||||
|
||||
let mapped_ring = cms.ring_map(&cell).unwrap();
|
||||
// let mapped_ring = cms.ring_map(&cell).unwrap();
|
||||
let (ox,oy) = cms.map((lb_lon, lb_lat)).unwrap();
|
||||
let (rx, ry) = cms.map((rt_lon, rt_lat)).unwrap();
|
||||
|
||||
let mut path = Path::new();
|
||||
let mut points = mapped_ring.points();
|
||||
let first_point = points.next().unwrap();
|
||||
path.move_to(first_point.x(), first_point.y());
|
||||
|
||||
for point in points {
|
||||
path.line_to(point.x(), point.y());
|
||||
}
|
||||
path.close();
|
||||
// let mut points = mapped_ring.points();
|
||||
// let first_point = points.next().unwrap();
|
||||
// path.move_to(first_point.x(), first_point.y());
|
||||
//
|
||||
// for point in points {
|
||||
// path.line_to(point.x(), point.y());
|
||||
// }
|
||||
path.rect(ox, oy, (rx - ox) * 1.5, (ry - oy) * 1.5);
|
||||
// path.close();
|
||||
canvas.fill_path(&path, &Paint::color(mapped_color.unwrap()));
|
||||
}
|
||||
}
|
||||
@ -107,11 +111,11 @@ where
|
||||
data: &Self::Data,
|
||||
size: (f32, f32),
|
||||
) -> Target {
|
||||
let start = std::time::Instant::now();
|
||||
let (w, h) = size;
|
||||
let new_img = canvas
|
||||
.create_image_empty(w as usize, h as usize, Rgba8, ImageFlags::empty())
|
||||
.expect("Can't Create Image");
|
||||
|
||||
canvas.image_size(new_img).unwrap();
|
||||
canvas.set_render_target(RenderTarget::Image(new_img));
|
||||
|
||||
@ -126,6 +130,7 @@ where
|
||||
|
||||
cms.set_lat_range(lat_start..lat_end);
|
||||
cms.set_lon_range(lon_start..lon_end);
|
||||
info!("Time to prepare data: {:?}", start.elapsed());
|
||||
|
||||
self.draw_2d(
|
||||
canvas,
|
||||
@ -136,6 +141,7 @@ where
|
||||
data.fill_value,
|
||||
);
|
||||
canvas.flush();
|
||||
info!("Time to render: {:?}", start.elapsed());
|
||||
let mut pixels: Vec<u8> = vec![0; w as usize * h as usize * 4];
|
||||
unsafe {
|
||||
gl::ReadPixels(
|
||||
@ -149,23 +155,25 @@ where
|
||||
);
|
||||
debug_assert_eq!(gl::GetError(), gl::NO_ERROR);
|
||||
}
|
||||
info!("Time to read pixels: {:?}", start.elapsed());
|
||||
|
||||
let img: ImageBuffer<Rgba<u8>, Vec<u8>> = ImageBuffer::from_raw(w as u32, h as u32, pixels)
|
||||
.expect("Failed to create ImageBuffer");
|
||||
let thumbnail = resize(&img, 500, 500, image::imageops::FilterType::Lanczos3);
|
||||
let mut thumb_buffer = Cursor::new(Vec::new());
|
||||
img.write_to(&mut thumb_buffer, image::ImageOutputFormat::Png)
|
||||
.expect("Failed to write PNG buffer");
|
||||
let thumb_data = thumb_buffer.into_inner();
|
||||
let thumbnail_tex =
|
||||
gtk::gdk::Texture::from_bytes(>k::glib::Bytes::from(&thumb_data)).unwrap();
|
||||
// let img: ImageBuffer<Rgba<u8>, Vec<u8>> = ImageBuffer::from_raw(w as u32, h as u32, pixels)
|
||||
// .expect("Failed to create ImageBuffer");
|
||||
// let thumbnail = resize(&img, 500, 500, image::imageops::FilterType::Lanczos3);
|
||||
// let mut thumb_buffer = Cursor::new(Vec::new());
|
||||
// img.write_to(&mut thumb_buffer, image::ImageOutputFormat::Png)
|
||||
// .expect("Failed to write PNG buffer");
|
||||
// info!("Time to write PNG: {:?}", start.elapsed());
|
||||
// let thumb_data = thumb_buffer.into_inner();
|
||||
// let thumbnail_tex =
|
||||
// gtk::gdk::Texture::from_bytes(>k::glib::Bytes::from(&thumb_data)).unwrap();
|
||||
|
||||
// 将 ImageBuffer 编码为 PNG
|
||||
let mut png_buffer = Cursor::new(Vec::new());
|
||||
img.write_to(&mut png_buffer, image::ImageOutputFormat::Bmp)
|
||||
.expect("Failed to write PNG buffer");
|
||||
// let mut png_buffer = Cursor::new(Vec::new());
|
||||
// img.write_to(&mut png_buffer, image::ImageOutputFormat::Bmp)
|
||||
// .expect("Failed to write PNG buffer");
|
||||
|
||||
let png_data = png_buffer.into_inner();
|
||||
// let png_data = png_buffer.into_inner();
|
||||
|
||||
let d1_start = (data.dim1.view()).first().unwrap().clone();
|
||||
let d1_end = (data.dim1.view()).last().unwrap().clone();
|
||||
@ -175,11 +183,12 @@ where
|
||||
canvas.set_render_target(RenderTarget::Screen);
|
||||
|
||||
Target::new(
|
||||
TargetType::Mem(png_data),
|
||||
TargetType::Mem(pixels),
|
||||
w,
|
||||
h,
|
||||
((d1_start, d1_end).into(), (d2_start, d2_end).into()),
|
||||
Some(thumbnail_tex),
|
||||
// Some(thumbnail_tex),
|
||||
None,
|
||||
None
|
||||
)
|
||||
}
|
||||
|
||||
20
src/predefined/map_tile.rs
Normal file
20
src/predefined/map_tile.rs
Normal file
@ -0,0 +1,20 @@
|
||||
use crate::map_tile_utils::*;
|
||||
use slippy_map_tiles::{BBox, merc_location_to_tile_coords, size_bbox_zoom_metatiles, Tile};
|
||||
|
||||
pub fn map_tile_layer(lat_range: (f64, f64), lon_range: (f64, f64), w: f32, h: f32) {
|
||||
let z = lat_lon_to_zoom(lat_range, lon_range, w, h);
|
||||
let bbox = BBox::new(lat_range.0 as f32, lon_range.0 as f32, lat_range.1 as f32, lon_range.1 as f32).unwrap();
|
||||
let size = size_bbox_zoom_metatiles(&bbox, z, 4);
|
||||
let t = Tile::new(10, 547, 380).unwrap();
|
||||
println!("size: {:?}", size);
|
||||
println!("tile: {:?}", t);
|
||||
}
|
||||
|
||||
|
||||
mod test {
|
||||
use super::*;
|
||||
#[test]
|
||||
fn test_map_tile_layer() {
|
||||
map_tile_layer((37.7749, 37.7749), (-122.4194, -122.4194), 1000.0, 1000.0);
|
||||
}
|
||||
}
|
||||
1
src/predefined/mod.rs
Normal file
1
src/predefined/mod.rs
Normal file
@ -0,0 +1 @@
|
||||
mod map_tile;
|
||||
@ -51,6 +51,7 @@ pub struct Render {
|
||||
pub(super) exterior: RefCell<ExteriorWidget>,
|
||||
pub(super) interior: RefCell<InteriorWidget>,
|
||||
pub(super) canvas: RefCell<Option<femtovg::Canvas<femtovg::renderer::OpenGl>>>,
|
||||
pub(super) glow_context: RefCell<Option<glow::Context>>,
|
||||
pub config: RefCell<RenderConfig>,
|
||||
pub status: RefCell<RenderStatus>,
|
||||
pub mapper: RefCell<Mapper>,
|
||||
@ -63,6 +64,7 @@ impl Default for Render {
|
||||
render_status: Cell::new(0),
|
||||
exterior: RefCell::new(ExteriorWidget::default()),
|
||||
interior: RefCell::new(InteriorWidget::default()),
|
||||
glow_context: RefCell::new(None),
|
||||
interior_layers: RefCell::new(Rc::new(RefCell::new(Vec::new()))),
|
||||
config: RefCell::new(RenderConfig::default()),
|
||||
status: RefCell::new(RenderStatus::default()),
|
||||
@ -240,6 +242,7 @@ impl Render {
|
||||
let id = NonZeroU32::new(ctx.get_parameter_i32(glow::DRAW_FRAMEBUFFER_BINDING) as u32)
|
||||
.expect("No GTK provided framebuffer binding");
|
||||
ctx.bind_framebuffer(glow::FRAMEBUFFER, None);
|
||||
self.glow_context.replace(Some(ctx));
|
||||
(renderer, glow::NativeFramebuffer(id))
|
||||
};
|
||||
renderer.set_screen_target(Some(fbo));
|
||||
|
||||
@ -1,180 +0,0 @@
|
||||
use super::super::{Render};
|
||||
use crate::pipeline::offscreen_renderer::CanvasWrapper;
|
||||
use crate::{coords::Range, widgets::widget::Widget};
|
||||
use femtovg::{renderer::OpenGl, Canvas, ImageId};
|
||||
use std::{
|
||||
cell::{Ref, RefCell},
|
||||
fmt::Debug,
|
||||
future::Future,
|
||||
pin::Pin,
|
||||
sync::{Arc, Mutex},
|
||||
};
|
||||
use crate::coords::cms::CMS;
|
||||
use crate::pipeline::element::Target;
|
||||
|
||||
type PrepareFunc = Arc<
|
||||
Mutex<
|
||||
Option<
|
||||
Box<
|
||||
dyn FnOnce(
|
||||
LayerImplSync,
|
||||
// Box<dyn LayerImpl + Send + Sync>,
|
||||
Arc<Mutex<CanvasWrapper>>,
|
||||
CMS,
|
||||
) -> Target
|
||||
+ Sync
|
||||
+ Send,
|
||||
>,
|
||||
>,
|
||||
>,
|
||||
>;
|
||||
type DrawFunc = Arc<dyn Fn(&Layer, Render, (f32, f32)) + Send + Sync>;
|
||||
pub type LayerImplSync = Arc<Mutex<Box<dyn LayerImpl + Send + Sync>>>;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Layer {
|
||||
pub visiable: bool,
|
||||
pub name: String,
|
||||
pub widgets: Arc<Mutex<Option<Vec<Box<dyn Widget>>>>>,
|
||||
target: Arc<Mutex<Option<Target>>>,
|
||||
prepare: PrepareFunc,
|
||||
imp: Option<Arc<Mutex<Box<dyn LayerImpl + Send + Sync>>>>,
|
||||
draw: DrawFunc,
|
||||
}
|
||||
|
||||
impl Debug for Layer {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
f.debug_struct("Layer")
|
||||
.field("visiable", &self.visiable)
|
||||
.field("target", &self.target)
|
||||
.field("imp", &self.imp)
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
pub trait LayerImpl: Debug {
|
||||
fn draw(&self, canvas: &mut Canvas<OpenGl>, cms: &CMS) -> Option<Target>;
|
||||
}
|
||||
|
||||
impl Layer {
|
||||
pub fn new<
|
||||
F: 'static + Fn(&Self, Render, (f32, f32)) + Send + Sync,
|
||||
PREPARE: FnOnce(LayerImplSync, Arc<Mutex<CanvasWrapper>>, CMS) -> Target + Send + Sync + 'static,
|
||||
IMP: LayerImpl + Sync + Send + 'static,
|
||||
>(
|
||||
visiable: bool,
|
||||
draw: F,
|
||||
widgets: Option<Vec<Box<dyn Widget>>>,
|
||||
layer_name: String,
|
||||
prepare: Option<PREPARE>,
|
||||
imp: Option<IMP>,
|
||||
) -> Self {
|
||||
Layer {
|
||||
visiable,
|
||||
target: Arc::new(Mutex::new(None)),
|
||||
name: layer_name,
|
||||
widgets: Arc::new(Mutex::new(widgets)),
|
||||
prepare: Arc::new(Mutex::new(prepare.map(|p| {
|
||||
Box::new(move |a, b, c| p(a, b, c))
|
||||
as Box<
|
||||
dyn FnOnce(LayerImplSync, Arc<Mutex<CanvasWrapper>>, CMS) -> Target
|
||||
+ Sync
|
||||
+ Send,
|
||||
>
|
||||
}))),
|
||||
draw: Arc::new(Box::new(draw)),
|
||||
imp: imp.map(|i| {
|
||||
Arc::new(Mutex::new(
|
||||
Box::new(i) as Box<dyn LayerImpl + Send + Sync + 'static>
|
||||
))
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn draw(&self, render: &Render, window_size: (f32, f32)) {
|
||||
if self.visiable {
|
||||
let drawer = &self.draw;
|
||||
drawer(self, render.clone(), window_size);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_prepare(&self) -> PrepareFunc {
|
||||
self.prepare.clone()
|
||||
}
|
||||
|
||||
pub fn set_render_target(&self, target: Target) {
|
||||
self.target.lock().unwrap().replace(target);
|
||||
}
|
||||
|
||||
pub fn render_target(&self) -> Arc<Mutex<Option<Target>>> {
|
||||
self.target.clone()
|
||||
}
|
||||
|
||||
pub fn get_imp(&self) -> Option<Arc<Mutex<Box<dyn LayerImpl + Sync + Send + 'static>>>> {
|
||||
// self.imp.map(|p| p.clone())
|
||||
self.imp.clone()
|
||||
}
|
||||
|
||||
pub fn get_thumbnail(&self) -> Option<gtk::gdk::Texture> {
|
||||
self.target
|
||||
.lock()
|
||||
.unwrap()
|
||||
.as_ref()
|
||||
.and_then(|t| t.thumbnail.clone())
|
||||
}
|
||||
}
|
||||
|
||||
// #[derive(Clone, Debug, PartialEq, PartialOrd)]
|
||||
// pub struct Target {
|
||||
// pub target: TargetType,
|
||||
// pub thumbnail: Option<gtk::gdk::Texture>,
|
||||
// pub width: f32,
|
||||
// pub height: f32,
|
||||
// pub bounds: (Range, Range),
|
||||
// }
|
||||
//
|
||||
// #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord)]
|
||||
// pub enum TargetType {
|
||||
// ImageId(ImageId),
|
||||
// Mem(Vec<u8>),
|
||||
// }
|
||||
//
|
||||
// impl Target {
|
||||
// pub fn new(
|
||||
// target: TargetType,
|
||||
// width: f32,
|
||||
// height: f32,
|
||||
// bounds: (Range, Range),
|
||||
// thumbnail: Option<gtk::gdk::Texture>,
|
||||
// ) -> Self {
|
||||
// Self {
|
||||
// target,
|
||||
// width,
|
||||
// height,
|
||||
// bounds,
|
||||
// thumbnail,
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// pub fn size(&self, render: &Render) -> (f32, f32) {
|
||||
// let (x, y) = self.bounds;
|
||||
//
|
||||
// let p1 = (x.0, y.0);
|
||||
// let p2 = (x.1, y.1);
|
||||
//
|
||||
// let (x1, y1) = render.map(p1).unwrap();
|
||||
// let (x2, y2) = render.map(p2).unwrap();
|
||||
//
|
||||
// ((x2 - x1).abs(), (y2 - y1).abs())
|
||||
// }
|
||||
//
|
||||
// pub fn origin(&self, render: &Render) -> (f32, f32) {
|
||||
// let (x, y) = self.bounds;
|
||||
// let p1 = (x.0, y.1);
|
||||
// render.map(p1).unwrap()
|
||||
// }
|
||||
//
|
||||
// pub fn set_target(&mut self, target: TargetType) {
|
||||
// self.target = target;
|
||||
// }
|
||||
// }
|
||||
@ -35,6 +35,7 @@ pub enum AssoElement {
|
||||
#[derive(Clone)]
|
||||
pub struct Layer {
|
||||
pub visiable: bool,
|
||||
pub alpha: f32,
|
||||
pub name: String,
|
||||
associated_element: AssoElement,
|
||||
time: Option<DateTime<Utc>>,
|
||||
@ -55,6 +56,7 @@ pub trait LayerImpl: Debug {
|
||||
impl Layer {
|
||||
pub fn new(visiable: bool, layer_name: String, element: AssoElement) -> Self {
|
||||
Layer {
|
||||
alpha: 1.0,
|
||||
visiable,
|
||||
name: layer_name,
|
||||
associated_element: element,
|
||||
@ -100,7 +102,7 @@ impl Layer {
|
||||
}
|
||||
};
|
||||
|
||||
let paint = femtovg::Paint::image(result_id, ox, oy, x, y, 0.0, 1.0);
|
||||
let paint = femtovg::Paint::image(result_id, ox, oy, x, y, 0.0, self.alpha);
|
||||
let mut path = femtovg::Path::new();
|
||||
path.rect(ox, oy, x, y);
|
||||
canvas.fill_path(&path, &paint);
|
||||
@ -119,6 +121,10 @@ impl Layer {
|
||||
None
|
||||
}
|
||||
|
||||
pub fn set_alpha(&mut self, alpha: f32) {
|
||||
self.alpha = alpha;
|
||||
}
|
||||
|
||||
pub fn change_visiable(&mut self, visiable: bool) {
|
||||
self.visiable = visiable;
|
||||
}
|
||||
|
||||
30
src/widgets/render/interior/map_tile.rs
Normal file
30
src/widgets/render/interior/map_tile.rs
Normal file
@ -0,0 +1,30 @@
|
||||
pub(super) struct MapTile {
|
||||
server: Option<String>,
|
||||
lat_range: (f64, f64),
|
||||
lon_range: (f64, f64),
|
||||
zoom: u8,
|
||||
}
|
||||
|
||||
impl MapTile{
|
||||
pub fn new(server: Option<String>, lat_range: (f64, f64), lon_range: (f64, f64), zoom: u8) -> MapTile {
|
||||
MapTile {
|
||||
server,
|
||||
lat_range,
|
||||
lon_range,
|
||||
zoom,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_server(&self) -> Option<String> {
|
||||
self.server.clone()
|
||||
}
|
||||
|
||||
pub fn get_lat_range(&self) -> (f64, f64) {
|
||||
self.lat_range
|
||||
}
|
||||
|
||||
pub fn get_lon_range(&self) -> (f64, f64) {
|
||||
self.lon_range
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
mod imp;
|
||||
mod layers;
|
||||
mod map_tile;
|
||||
|
||||
use super::super::Render;
|
||||
use femtovg::{renderer::OpenGl, Canvas};
|
||||
pub use layers::{Layer, LayerImpl, LayerImplSync, AssoElement};
|
||||
|
||||
@ -112,6 +112,10 @@ impl Render {
|
||||
self.imp().canvas.borrow_mut()
|
||||
}
|
||||
|
||||
pub fn get_context(&self) -> RefMut<'_, Option<glow::Context>> {
|
||||
self.imp().glow_context.borrow_mut()
|
||||
}
|
||||
|
||||
pub fn set_cfg(&self, cfg: RenderConfig) {
|
||||
self.imp().config.replace(cfg);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user