diff --git a/.github/workflows/spelling_and_links.yml b/.github/workflows/spelling_and_links.yml
new file mode 100644
index 00000000000..2b4c8de14d8
--- /dev/null
+++ b/.github/workflows/spelling_and_links.yml
@@ -0,0 +1,38 @@
+name: Check spelling and links
+on: [pull_request]
+
+jobs:
+ typos:
+ # https://github.com/crate-ci/typos
+ # Add exceptions to _typos.toml
+ # install and run locally: cargo install typos-cli && typos
+ name: typos
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout Actions Repository
+ uses: actions/checkout@v4
+
+ - name: Check spelling of entire workspace
+ uses: crate-ci/typos@master
+ # Disabled: too many names of crates and user-names etc
+ # spellcheck:
+ # name: Spellcheck
+ # runs-on: ubuntu-latest
+ # steps:
+ # - uses: actions/checkout@v4
+ # - uses: streetsidesoftware/cspell-action@v2
+ # with:
+ # files: "**/*.md"
+ linkinator:
+ name: linkinator
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: jprochazk/linkinator-action@main
+ with:
+ linksToSkip: "https://crates.io/crates/.*, http://localhost:.*" # Avoid crates.io rate-limiting
+ retry: true
+ retryErrors: true
+ retryErrorsCount: 5
+ retryErrorsJitter: 2000
+
diff --git a/.github/workflows/typos.yml b/.github/workflows/typos.yml
deleted file mode 100644
index 6ed55693688..00000000000
--- a/.github/workflows/typos.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-# https://github.com/crate-ci/typos
-# Add exceptions to _typos.toml
-# install and run locally: cargo install typos-cli && typos
-
-name: Spell Check
-on: [pull_request]
-
-jobs:
- run:
- name: Spell Check
- runs-on: ubuntu-latest
- steps:
- - name: Checkout Actions Repository
- uses: actions/checkout@v4
-
- - name: Check spelling of entire workspace
- uses: crate-ci/typos@master
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e57ab538931..8e4da41862c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -329,7 +329,7 @@ egui_extras::install_image_loaders(egui_ctx);
### Contributors 🙏
* [4JX](https://github.com/4JX)
-* [AlexxxRu](https://github.com/AlexxxRu)
+* [a-liashenko](https://github.com/a-liashenko)
* [ascclemens](https://github.com/ascclemens)
* [awaken1ng](https://github.com/awaken1ng)
* [bigfarts](https://github.com/bigfarts)
@@ -425,7 +425,7 @@ egui_extras::install_image_loaders(egui_ctx);
* [4JX](https://github.com/4JX)
* [55nknown](https://github.com/55nknown)
* [AlanRace](https://github.com/AlanRace)
-* [AlexxxRu](https://github.com/AlexxxRu)
+* [a-liashenko](https://github.com/a-liashenko)
* [awaken1ng](https://github.com/awaken1ng)
* [BctfN0HUK7Yg](https://github.com/BctfN0HUK7Yg)
* [Bromeon](https://github.com/Bromeon)
diff --git a/Cargo.lock b/Cargo.lock
index f559b75dd91..8b82293ec8f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -108,14 +108,15 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "ahash"
-version = "0.8.3"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
+checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a"
dependencies = [
"cfg-if",
"once_cell",
"serde",
"version_check",
+ "zerocopy",
]
[[package]]
@@ -445,6 +446,12 @@ version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+[[package]]
+name = "base64"
+version = "0.21.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2"
+
[[package]]
name = "bincode"
version = "1.3.3"
@@ -503,6 +510,9 @@ name = "bitflags"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
+dependencies = [
+ "serde",
+]
[[package]]
name = "block"
@@ -1311,7 +1321,7 @@ dependencies = [
"enum-map",
"image",
"log",
- "mime_guess",
+ "mime_guess2",
"puffin",
"resvg",
"serde",
@@ -2437,10 +2447,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
-name = "mime_guess"
-version = "2.0.4"
+name = "mime_guess2"
+version = "2.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
+checksum = "25a3333bb1609500601edc766a39b4c1772874a4ce26022f4d866854dc020c41"
dependencies = [
"mime",
"unicase",
@@ -2884,11 +2894,11 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
[[package]]
name = "plist"
-version = "1.4.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5329b8f106a176ab0dce4aae5da86bfcb139bb74fb00882859e03745011f3635"
+checksum = "bdc0001cfea3db57a2e24bc0d818e9e20e554b5f97fabb9bc231dc240269ae06"
dependencies = [
- "base64",
+ "base64 0.21.4",
"indexmap 1.9.3",
"line-wrap",
"quick-xml",
@@ -3023,9 +3033,9 @@ dependencies = [
[[package]]
name = "quick-xml"
-version = "0.26.0"
+version = "0.29.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f50b1c63b38611e7d4d7f68b82d3ad0cc71a2ad2e7f61fc10f1328d917c93cd"
+checksum = "81b9228215d82c7b61490fec1de287136b5de6f5700f6e58ea9ad61a7964ca51"
dependencies = [
"memchr",
]
@@ -3216,13 +3226,14 @@ dependencies = [
[[package]]
name = "ron"
-version = "0.8.0"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "300a51053b1cb55c80b7a9fde4120726ddf25ca241a1cbb926626f62fb136bff"
+checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"
dependencies = [
- "base64",
- "bitflags 1.3.2",
+ "base64 0.21.4",
+ "bitflags 2.4.0",
"serde",
+ "serde_derive",
]
[[package]]
@@ -3275,14 +3286,24 @@ dependencies = [
[[package]]
name = "rustls"
-version = "0.20.9"
+version = "0.21.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b80e3dec595989ea8510028f30c408a4630db12c9cbb8de34203b89d6577e99"
+checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8"
dependencies = [
"log",
"ring",
+ "rustls-webpki",
"sct",
- "webpki",
+]
+
+[[package]]
+name = "rustls-webpki"
+version = "0.101.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe"
+dependencies = [
+ "ring",
+ "untrusted",
]
[[package]]
@@ -3967,17 +3988,17 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
[[package]]
name = "ureq"
-version = "2.6.2"
+version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "338b31dd1314f68f3aabf3ed57ab922df95ffcd902476ca7ba3c4ce7b908c46d"
+checksum = "f5ccd538d4a604753ebc2f17cd9946e89b77bf87f6a8e2309667c6f2e87855e3"
dependencies = [
- "base64",
+ "base64 0.21.4",
"flate2",
"log",
"once_cell",
"rustls",
+ "rustls-webpki",
"url",
- "webpki",
"webpki-roots",
]
@@ -4006,7 +4027,7 @@ version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b5b7c2b30845b3348c067ca3d09e20cc6e327c288f0ca4c48698712abf432e9"
dependencies = [
- "base64",
+ "base64 0.13.1",
"data-url",
"flate2",
"imagesize",
@@ -4257,24 +4278,11 @@ dependencies = [
"web-sys",
]
-[[package]]
-name = "webpki"
-version = "0.22.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f0e74f82d49d545ad128049b7e88f6576df2da6b02e9ce565c6f533be576957e"
-dependencies = [
- "ring",
- "untrusted",
-]
-
[[package]]
name = "webpki-roots"
-version = "0.22.6"
+version = "0.25.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87"
-dependencies = [
- "webpki",
-]
+checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc"
[[package]]
name = "wgpu"
@@ -4809,6 +4817,26 @@ dependencies = [
"zvariant",
]
+[[package]]
+name = "zerocopy"
+version = "0.7.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "686b7e407015242119c33dab17b8f61ba6843534de936d94368856528eae4dcc"
+dependencies = [
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.7.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "020f3dfe25dfc38dfea49ce62d5d45ecdd7f0d8a724fa63eb36b6eba4ec76806"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.37",
+]
+
[[package]]
name = "zvariant"
version = "3.15.0"
diff --git a/README.md b/README.md
index cbfa92eb421..520304b14b7 100644
--- a/README.md
+++ b/README.md
@@ -298,7 +298,7 @@ Yes! You can customize the colors, spacing, fonts and sizes of everything using
This is not yet as powerful as say CSS, [but this is going to improve soon](https://github.com/emilk/egui/issues/3284).
-Here is an example (from https://github.com/AlexxxRu/TinyPomodoro):
+Here is an example (from https://github.com/a-liashenko/TinyPomodoro):
@@ -332,7 +332,7 @@ If you want to embed 3D into an egui view there are two options.
#### `Shape::Callback`
Example:
-*
+*
`Shape::Callback` will call your code when egui gets painted, to show anything using whatever the background rendering context is. When using [`eframe`](https://github.com/emilk/egui/tree/master/crates/eframe) this will be [`glow`](https://github.com/grovesNL/glow). Other integrations will give you other rendering contexts, if they support `Shape::Callback` at all.
diff --git a/crates/ecolor/src/color32.rs b/crates/ecolor/src/color32.rs
index 6f2c11272b5..56b96589256 100644
--- a/crates/ecolor/src/color32.rs
+++ b/crates/ecolor/src/color32.rs
@@ -16,14 +16,14 @@ pub struct Color32(pub(crate) [u8; 4]);
impl std::ops::Index for Color32 {
type Output = u8;
- #[inline(always)]
+ #[inline]
fn index(&self, index: usize) -> &u8 {
&self.0[index]
}
}
impl std::ops::IndexMut for Color32 {
- #[inline(always)]
+ #[inline]
fn index_mut(&mut self, index: usize) -> &mut u8 {
&mut self.0[index]
}
@@ -63,23 +63,24 @@ impl Color32 {
/// An ugly color that is planned to be replaced before making it to the screen.
pub const TEMPORARY_COLOR: Color32 = Color32::from_rgb(64, 254, 0);
- #[inline(always)]
+ #[inline]
pub const fn from_rgb(r: u8, g: u8, b: u8) -> Self {
Self([r, g, b, 255])
}
- #[inline(always)]
+ #[inline]
pub const fn from_rgb_additive(r: u8, g: u8, b: u8) -> Self {
Self([r, g, b, 0])
}
/// From `sRGBA` with premultiplied alpha.
- #[inline(always)]
+ #[inline]
pub const fn from_rgba_premultiplied(r: u8, g: u8, b: u8, a: u8) -> Self {
Self([r, g, b, a])
}
/// From `sRGBA` WITHOUT premultiplied alpha.
+ #[inline]
pub fn from_rgba_unmultiplied(r: u8, g: u8, b: u8, a: u8) -> Self {
if a == 255 {
Self::from_rgb(r, g, b) // common-case optimization
@@ -99,80 +100,83 @@ impl Color32 {
}
}
- #[inline(always)]
+ #[inline]
pub const fn from_gray(l: u8) -> Self {
Self([l, l, l, 255])
}
- #[inline(always)]
+ #[inline]
pub const fn from_black_alpha(a: u8) -> Self {
Self([0, 0, 0, a])
}
+ #[inline]
pub fn from_white_alpha(a: u8) -> Self {
Rgba::from_white_alpha(linear_f32_from_linear_u8(a)).into()
}
- #[inline(always)]
+ #[inline]
pub const fn from_additive_luminance(l: u8) -> Self {
Self([l, l, l, 0])
}
- #[inline(always)]
+ #[inline]
pub const fn is_opaque(&self) -> bool {
self.a() == 255
}
- #[inline(always)]
+ #[inline]
pub const fn r(&self) -> u8 {
self.0[0]
}
- #[inline(always)]
+ #[inline]
pub const fn g(&self) -> u8 {
self.0[1]
}
- #[inline(always)]
+ #[inline]
pub const fn b(&self) -> u8 {
self.0[2]
}
- #[inline(always)]
+ #[inline]
pub const fn a(&self) -> u8 {
self.0[3]
}
/// Returns an opaque version of self
+ #[inline]
pub fn to_opaque(self) -> Self {
Rgba::from(self).to_opaque().into()
}
/// Returns an additive version of self
- #[inline(always)]
+ #[inline]
pub const fn additive(self) -> Self {
let [r, g, b, _] = self.to_array();
Self([r, g, b, 0])
}
/// Is the alpha=0 ?
- #[inline(always)]
+ #[inline]
pub fn is_additive(self) -> bool {
self.a() == 0
}
/// Premultiplied RGBA
- #[inline(always)]
+ #[inline]
pub const fn to_array(&self) -> [u8; 4] {
[self.r(), self.g(), self.b(), self.a()]
}
/// Premultiplied RGBA
- #[inline(always)]
+ #[inline]
pub const fn to_tuple(&self) -> (u8, u8, u8, u8) {
(self.r(), self.g(), self.b(), self.a())
}
+ #[inline]
pub fn to_srgba_unmultiplied(&self) -> [u8; 4] {
Rgba::from(*self).to_srgba_unmultiplied()
}
@@ -198,6 +202,7 @@ impl Color32 {
///
/// This is using linear space, which is not perceptually even.
/// You may want to use [`Self::gamma_multiply`] instead.
+ #[inline]
pub fn linear_multiply(self, factor: f32) -> Color32 {
crate::ecolor_assert!(0.0 <= factor && factor <= 1.0);
// As an unfortunate side-effect of using premultiplied alpha
diff --git a/crates/ecolor/src/hsva.rs b/crates/ecolor/src/hsva.rs
index 8a68cb93502..1fa54a24e10 100644
--- a/crates/ecolor/src/hsva.rs
+++ b/crates/ecolor/src/hsva.rs
@@ -21,11 +21,13 @@ pub struct Hsva {
}
impl Hsva {
+ #[inline]
pub fn new(h: f32, s: f32, v: f32, a: f32) -> Self {
Self { h, s, v, a }
}
/// From `sRGBA` with premultiplied alpha
+ #[inline]
pub fn from_srgba_premultiplied(srgba: [u8; 4]) -> Self {
Self::from_rgba_premultiplied(
linear_f32_from_gamma_u8(srgba[0]),
@@ -36,6 +38,7 @@ impl Hsva {
}
/// From `sRGBA` without premultiplied alpha
+ #[inline]
pub fn from_srgba_unmultiplied(srgba: [u8; 4]) -> Self {
Self::from_rgba_unmultiplied(
linear_f32_from_gamma_u8(srgba[0]),
@@ -46,6 +49,7 @@ impl Hsva {
}
/// From linear RGBA with premultiplied alpha
+ #[inline]
pub fn from_rgba_premultiplied(r: f32, g: f32, b: f32, a: f32) -> Self {
#![allow(clippy::many_single_char_names)]
if a == 0.0 {
@@ -61,12 +65,14 @@ impl Hsva {
}
/// From linear RGBA without premultiplied alpha
+ #[inline]
pub fn from_rgba_unmultiplied(r: f32, g: f32, b: f32, a: f32) -> Self {
#![allow(clippy::many_single_char_names)]
let (h, s, v) = hsv_from_rgb([r, g, b]);
Hsva { h, s, v, a }
}
+ #[inline]
pub fn from_additive_rgb(rgb: [f32; 3]) -> Self {
let (h, s, v) = hsv_from_rgb(rgb);
Hsva {
@@ -77,11 +83,13 @@ impl Hsva {
}
}
+ #[inline]
pub fn from_rgb(rgb: [f32; 3]) -> Self {
let (h, s, v) = hsv_from_rgb(rgb);
Hsva { h, s, v, a: 1.0 }
}
+ #[inline]
pub fn from_srgb([r, g, b]: [u8; 3]) -> Self {
Self::from_rgb([
linear_f32_from_gamma_u8(r),
@@ -92,14 +100,17 @@ impl Hsva {
// ------------------------------------------------------------------------
+ #[inline]
pub fn to_opaque(self) -> Self {
Self { a: 1.0, ..self }
}
+ #[inline]
pub fn to_rgb(&self) -> [f32; 3] {
rgb_from_hsv((self.h, self.s, self.v))
}
+ #[inline]
pub fn to_srgb(&self) -> [u8; 3] {
let [r, g, b] = self.to_rgb();
[
@@ -109,6 +120,7 @@ impl Hsva {
]
}
+ #[inline]
pub fn to_rgba_premultiplied(&self) -> [f32; 4] {
let [r, g, b, a] = self.to_rgba_unmultiplied();
let additive = a < 0.0;
@@ -120,12 +132,14 @@ impl Hsva {
}
/// Represents additive colors using a negative alpha.
+ #[inline]
pub fn to_rgba_unmultiplied(&self) -> [f32; 4] {
let Hsva { h, s, v, a } = *self;
let [r, g, b] = rgb_from_hsv((h, s, v));
[r, g, b, a]
}
+ #[inline]
pub fn to_srgba_premultiplied(&self) -> [u8; 4] {
let [r, g, b, a] = self.to_rgba_premultiplied();
[
@@ -136,6 +150,7 @@ impl Hsva {
]
}
+ #[inline]
pub fn to_srgba_unmultiplied(&self) -> [u8; 4] {
let [r, g, b, a] = self.to_rgba_unmultiplied();
[
@@ -148,30 +163,35 @@ impl Hsva {
}
impl From for Rgba {
+ #[inline]
fn from(hsva: Hsva) -> Rgba {
Rgba(hsva.to_rgba_premultiplied())
}
}
impl From for Hsva {
+ #[inline]
fn from(rgba: Rgba) -> Hsva {
Self::from_rgba_premultiplied(rgba.0[0], rgba.0[1], rgba.0[2], rgba.0[3])
}
}
impl From for Color32 {
+ #[inline]
fn from(hsva: Hsva) -> Color32 {
Color32::from(Rgba::from(hsva))
}
}
impl From for Hsva {
+ #[inline]
fn from(srgba: Color32) -> Hsva {
Hsva::from(Rgba::from(srgba))
}
}
/// All ranges in 0-1, rgb is linear.
+#[inline]
pub fn hsv_from_rgb([r, g, b]: [f32; 3]) -> (f32, f32, f32) {
#![allow(clippy::many_single_char_names)]
let min = r.min(g.min(b));
@@ -195,6 +215,7 @@ pub fn hsv_from_rgb([r, g, b]: [f32; 3]) -> (f32, f32, f32) {
}
/// All ranges in 0-1, rgb is linear.
+#[inline]
pub fn rgb_from_hsv((h, s, v): (f32, f32, f32)) -> [f32; 3] {
#![allow(clippy::many_single_char_names)]
let h = (h.fract() + 1.0).fract(); // wrap
diff --git a/crates/ecolor/src/rgba.rs b/crates/ecolor/src/rgba.rs
index 849696ddc6f..b40f70e3e51 100644
--- a/crates/ecolor/src/rgba.rs
+++ b/crates/ecolor/src/rgba.rs
@@ -13,20 +13,20 @@ pub struct Rgba(pub(crate) [f32; 4]);
impl std::ops::Index for Rgba {
type Output = f32;
- #[inline(always)]
+ #[inline]
fn index(&self, index: usize) -> &f32 {
&self.0[index]
}
}
impl std::ops::IndexMut for Rgba {
- #[inline(always)]
+ #[inline]
fn index_mut(&mut self, index: usize) -> &mut f32 {
&mut self.0[index]
}
}
-#[inline(always)]
+#[inline]
pub(crate) fn f32_hash(state: &mut H, f: f32) {
if f == 0.0 {
state.write_u8(0);
@@ -57,17 +57,17 @@ impl Rgba {
pub const GREEN: Rgba = Rgba::from_rgb(0.0, 1.0, 0.0);
pub const BLUE: Rgba = Rgba::from_rgb(0.0, 0.0, 1.0);
- #[inline(always)]
+ #[inline]
pub const fn from_rgba_premultiplied(r: f32, g: f32, b: f32, a: f32) -> Self {
Self([r, g, b, a])
}
- #[inline(always)]
+ #[inline]
pub fn from_rgba_unmultiplied(r: f32, g: f32, b: f32, a: f32) -> Self {
Self([r * a, g * a, b * a, a])
}
- #[inline(always)]
+ #[inline]
pub fn from_srgba_premultiplied(r: u8, g: u8, b: u8, a: u8) -> Self {
let r = linear_f32_from_gamma_u8(r);
let g = linear_f32_from_gamma_u8(g);
@@ -76,7 +76,7 @@ impl Rgba {
Self::from_rgba_premultiplied(r, g, b, a)
}
- #[inline(always)]
+ #[inline]
pub fn from_srgba_unmultiplied(r: u8, g: u8, b: u8, a: u8) -> Self {
let r = linear_f32_from_gamma_u8(r);
let g = linear_f32_from_gamma_u8(g);
@@ -85,16 +85,17 @@ impl Rgba {
Self::from_rgba_premultiplied(r * a, g * a, b * a, a)
}
- #[inline(always)]
+ #[inline]
pub const fn from_rgb(r: f32, g: f32, b: f32) -> Self {
Self([r, g, b, 1.0])
}
- #[inline(always)]
+ #[inline]
pub const fn from_gray(l: f32) -> Self {
Self([l, l, l, 1.0])
}
+ #[inline]
pub fn from_luminance_alpha(l: f32, a: f32) -> Self {
crate::ecolor_assert!(0.0 <= l && l <= 1.0);
crate::ecolor_assert!(0.0 <= a && a <= 1.0);
@@ -102,34 +103,34 @@ impl Rgba {
}
/// Transparent black
- #[inline(always)]
+ #[inline]
pub fn from_black_alpha(a: f32) -> Self {
crate::ecolor_assert!(0.0 <= a && a <= 1.0);
Self([0.0, 0.0, 0.0, a])
}
/// Transparent white
- #[inline(always)]
+ #[inline]
pub fn from_white_alpha(a: f32) -> Self {
crate::ecolor_assert!(0.0 <= a && a <= 1.0, "a: {}", a);
Self([a, a, a, a])
}
/// Return an additive version of this color (alpha = 0)
- #[inline(always)]
+ #[inline]
pub fn additive(self) -> Self {
let [r, g, b, _] = self.0;
Self([r, g, b, 0.0])
}
/// Is the alpha=0 ?
- #[inline(always)]
+ #[inline]
pub fn is_additive(self) -> bool {
self.a() == 0.0
}
/// Multiply with e.g. 0.5 to make us half transparent
- #[inline(always)]
+ #[inline]
pub fn multiply(self, alpha: f32) -> Self {
Self([
alpha * self[0],
@@ -139,22 +140,22 @@ impl Rgba {
])
}
- #[inline(always)]
+ #[inline]
pub fn r(&self) -> f32 {
self.0[0]
}
- #[inline(always)]
+ #[inline]
pub fn g(&self) -> f32 {
self.0[1]
}
- #[inline(always)]
+ #[inline]
pub fn b(&self) -> f32 {
self.0[2]
}
- #[inline(always)]
+ #[inline]
pub fn a(&self) -> f32 {
self.0[3]
}
@@ -166,6 +167,7 @@ impl Rgba {
}
/// Returns an opaque version of self
+ #[inline]
pub fn to_opaque(&self) -> Self {
if self.a() == 0.0 {
// Additive or fully transparent black.
@@ -181,18 +183,19 @@ impl Rgba {
}
/// Premultiplied RGBA
- #[inline(always)]
+ #[inline]
pub fn to_array(&self) -> [f32; 4] {
[self.r(), self.g(), self.b(), self.a()]
}
/// Premultiplied RGBA
- #[inline(always)]
+ #[inline]
pub fn to_tuple(&self) -> (f32, f32, f32, f32) {
(self.r(), self.g(), self.b(), self.a())
}
/// unmultiply the alpha
+ #[inline]
pub fn to_rgba_unmultiplied(&self) -> [f32; 4] {
let a = self.a();
if a == 0.0 {
@@ -204,6 +207,7 @@ impl Rgba {
}
/// unmultiply the alpha
+ #[inline]
pub fn to_srgba_unmultiplied(&self) -> [u8; 4] {
let [r, g, b, a] = self.to_rgba_unmultiplied();
[
@@ -218,7 +222,7 @@ impl Rgba {
impl std::ops::Add for Rgba {
type Output = Rgba;
- #[inline(always)]
+ #[inline]
fn add(self, rhs: Rgba) -> Rgba {
Rgba([
self[0] + rhs[0],
@@ -232,7 +236,7 @@ impl std::ops::Add for Rgba {
impl std::ops::Mul for Rgba {
type Output = Rgba;
- #[inline(always)]
+ #[inline]
fn mul(self, other: Rgba) -> Rgba {
Rgba([
self[0] * other[0],
@@ -246,7 +250,7 @@ impl std::ops::Mul for Rgba {
impl std::ops::Mul for Rgba {
type Output = Rgba;
- #[inline(always)]
+ #[inline]
fn mul(self, factor: f32) -> Rgba {
Rgba([
self[0] * factor,
@@ -260,7 +264,7 @@ impl std::ops::Mul for Rgba {
impl std::ops::Mul for f32 {
type Output = Rgba;
- #[inline(always)]
+ #[inline]
fn mul(self, rgba: Rgba) -> Rgba {
Rgba([
self * rgba[0],
diff --git a/crates/egui/src/containers/resize.rs b/crates/egui/src/containers/resize.rs
index e991e4e1043..78917234216 100644
--- a/crates/egui/src/containers/resize.rs
+++ b/crates/egui/src/containers/resize.rs
@@ -332,12 +332,12 @@ impl Resize {
use epaint::Stroke;
-pub fn paint_resize_corner(ui: &mut Ui, response: &Response) {
+pub fn paint_resize_corner(ui: &Ui, response: &Response) {
let stroke = ui.style().interact(response).fg_stroke;
paint_resize_corner_with_style(ui, &response.rect, stroke, Align2::RIGHT_BOTTOM);
}
-pub fn paint_resize_corner_with_style(ui: &mut Ui, rect: &Rect, stroke: Stroke, corner: Align2) {
+pub fn paint_resize_corner_with_style(ui: &Ui, rect: &Rect, stroke: Stroke, corner: Align2) {
let painter = ui.painter();
let cp = painter.round_pos_to_pixels(corner.pos_in_rect(rect));
let mut w = 2.0;
diff --git a/crates/egui/src/containers/window.rs b/crates/egui/src/containers/window.rs
index aa3fad11872..c12199d40ac 100644
--- a/crates/egui/src/containers/window.rs
+++ b/crates/egui/src/containers/window.rs
@@ -429,7 +429,7 @@ impl<'open> Window<'open> {
.map_or((None, None), |ir| (Some(ir.inner), Some(ir.response)));
let outer_rect = frame.end(&mut area_content_ui).rect;
- paint_resize_corner(&mut area_content_ui, &possible, outer_rect, frame_stroke);
+ paint_resize_corner(&area_content_ui, &possible, outer_rect, frame_stroke);
// END FRAME --------------------------------
@@ -448,7 +448,7 @@ impl<'open> Window<'open> {
if let Some(interaction) = interaction {
paint_frame_interaction(
- &mut area_content_ui,
+ &area_content_ui,
outer_rect,
interaction,
ctx.style().visuals.widgets.active,
@@ -456,7 +456,7 @@ impl<'open> Window<'open> {
} else if let Some(hover_interaction) = hover_interaction {
if ctx.input(|i| i.pointer.has_pointer()) {
paint_frame_interaction(
- &mut area_content_ui,
+ &area_content_ui,
outer_rect,
hover_interaction,
ctx.style().visuals.widgets.hovered,
@@ -476,12 +476,7 @@ impl<'open> Window<'open> {
}
}
-fn paint_resize_corner(
- ui: &mut Ui,
- possible: &PossibleInteractions,
- outer_rect: Rect,
- stroke: Stroke,
-) {
+fn paint_resize_corner(ui: &Ui, possible: &PossibleInteractions, outer_rect: Rect, stroke: Stroke) {
let corner = if possible.resize_right && possible.resize_bottom {
Align2::RIGHT_BOTTOM
} else if possible.resize_left && possible.resize_bottom {
@@ -758,7 +753,7 @@ fn resize_hover(
/// Fill in parts of the window frame when we resize by dragging that part
fn paint_frame_interaction(
- ui: &mut Ui,
+ ui: &Ui,
rect: Rect,
interaction: WindowInteraction,
visuals: style::WidgetVisuals,
diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs
index 193d83df329..10b932513c5 100644
--- a/crates/egui/src/context.rs
+++ b/crates/egui/src/context.rs
@@ -1523,7 +1523,7 @@ impl Context {
});
#[cfg_attr(not(feature = "accesskit"), allow(unused_mut))]
- let mut platform_output: PlatformOutput = self.output_mut(|o| std::mem::take(o));
+ let mut platform_output: PlatformOutput = self.output_mut(std::mem::take);
#[cfg(feature = "accesskit")]
{
diff --git a/crates/egui/src/grid.rs b/crates/egui/src/grid.rs
index 3e3e1df99ff..fe8f952bd28 100644
--- a/crates/egui/src/grid.rs
+++ b/crates/egui/src/grid.rs
@@ -221,7 +221,7 @@ impl GridLayout {
self.col += 1;
}
- fn paint_row(&mut self, cursor: &mut Rect, painter: &Painter) {
+ fn paint_row(&mut self, cursor: &Rect, painter: &Painter) {
// handle row color painting based on color-picker function
let Some(color_picker) = self.color_picker.as_ref() else {
return;
@@ -433,9 +433,9 @@ impl Grid {
// paint first incoming row
if is_color {
- let mut cursor = ui.cursor();
+ let cursor = ui.cursor();
let painter = ui.painter();
- grid.paint_row(&mut cursor, painter);
+ grid.paint_row(&cursor, painter);
}
ui.set_grid(grid);
diff --git a/crates/egui/src/menu.rs b/crates/egui/src/menu.rs
index 55f60e52cce..410d6b2e188 100644
--- a/crates/egui/src/menu.rs
+++ b/crates/egui/src/menu.rs
@@ -608,7 +608,7 @@ impl MenuState {
}
/// Sense button interaction opening and closing submenu.
- fn submenu_button_interaction(&mut self, ui: &mut Ui, sub_id: Id, button: &Response) {
+ fn submenu_button_interaction(&mut self, ui: &Ui, sub_id: Id, button: &Response) {
let pointer = ui.input(|i| i.pointer.clone());
let open = self.is_open(sub_id);
if self.moving_towards_current_submenu(&pointer) {
diff --git a/crates/egui/src/widgets/color_picker.rs b/crates/egui/src/widgets/color_picker.rs
index aed954793e7..5958d0758dc 100644
--- a/crates/egui/src/widgets/color_picker.rs
+++ b/crates/egui/src/widgets/color_picker.rs
@@ -317,7 +317,7 @@ fn color_picker_hsvag_2d(ui: &mut Ui, hsva: &mut HsvaGamma, alpha: Alpha) {
color_slider_2d(ui, s, v, |s, v| HsvaGamma { s, v, ..opaque }.into());
}
-//// Shows a color picker where the user can change the given [`Hsva`] color.
+/// Shows a color picker where the user can change the given [`Hsva`] color.
///
/// Returns `true` on change.
pub fn color_picker_hsva_2d(ui: &mut Ui, hsva: &mut Hsva, alpha: Alpha) -> bool {
diff --git a/crates/egui/src/widgets/image.rs b/crates/egui/src/widgets/image.rs
index c1838b46424..2bf150c9fe3 100644
--- a/crates/egui/src/widgets/image.rs
+++ b/crates/egui/src/widgets/image.rs
@@ -269,7 +269,7 @@ impl<'a> Image<'a> {
self.size.calc_size(available_size, original_image_size)
}
- pub fn load_and_calc_size(&self, ui: &mut Ui, available_size: Vec2) -> Option {
+ pub fn load_and_calc_size(&self, ui: &Ui, available_size: Vec2) -> Option {
let image_size = self.load_for_size(ui.ctx(), available_size).ok()?.size()?;
Some(self.size.calc_size(available_size, image_size))
}
@@ -317,7 +317,7 @@ impl<'a> Image<'a> {
/// # });
/// ```
#[inline]
- pub fn paint_at(&self, ui: &mut Ui, rect: Rect) {
+ pub fn paint_at(&self, ui: &Ui, rect: Rect) {
paint_texture_load_result(
ui,
&self.load_for_size(ui.ctx(), rect.size()),
diff --git a/crates/egui/src/widgets/slider.rs b/crates/egui/src/widgets/slider.rs
index 1d4c5f8d998..72bceb32720 100644
--- a/crates/egui/src/widgets/slider.rs
+++ b/crates/egui/src/widgets/slider.rs
@@ -548,7 +548,7 @@ impl<'a> Slider<'a> {
}
/// Just the slider, no text
- fn slider_ui(&mut self, ui: &mut Ui, response: &Response) {
+ fn slider_ui(&mut self, ui: &Ui, response: &Response) {
let rect = &response.rect;
let position_range = self.position_range(rect);
diff --git a/crates/egui/src/widgets/text_edit/builder.rs b/crates/egui/src/widgets/text_edit/builder.rs
index f07beedea19..7de4733a059 100644
--- a/crates/egui/src/widgets/text_edit/builder.rs
+++ b/crates/egui/src/widgets/text_edit/builder.rs
@@ -876,7 +876,7 @@ fn ccursor_from_accesskit_text_position(
/// Check for (keyboard) events to edit the cursor and/or text.
#[allow(clippy::too_many_arguments)]
fn events(
- ui: &mut crate::Ui,
+ ui: &crate::Ui,
state: &mut TextEditState,
text: &mut dyn TextBuffer,
galley: &mut Arc,
@@ -1089,7 +1089,7 @@ fn events(
// ----------------------------------------------------------------------------
fn paint_cursor_selection(
- ui: &mut Ui,
+ ui: &Ui,
painter: &Painter,
pos: Pos2,
galley: &Galley,
@@ -1131,7 +1131,7 @@ fn paint_cursor_selection(
}
fn paint_cursor_end(
- ui: &mut Ui,
+ ui: &Ui,
row_height: f32,
painter: &Painter,
pos: Pos2,
diff --git a/crates/egui_demo_app/src/backend_panel.rs b/crates/egui_demo_app/src/backend_panel.rs
index ae7336156f7..fb0d9ae4979 100644
--- a/crates/egui_demo_app/src/backend_panel.rs
+++ b/crates/egui_demo_app/src/backend_panel.rs
@@ -62,7 +62,7 @@ pub struct BackendPanel {
}
impl BackendPanel {
- pub fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
+ pub fn update(&mut self, ctx: &egui::Context, frame: &eframe::Frame) {
self.frame_history
.on_new_frame(ctx.input(|i| i.time), frame.info().cpu_usage);
diff --git a/crates/egui_extras/Cargo.toml b/crates/egui_extras/Cargo.toml
index 6d9ea6993e6..5712a16b21a 100644
--- a/crates/egui_extras/Cargo.toml
+++ b/crates/egui_extras/Cargo.toml
@@ -24,7 +24,7 @@ all-features = true
[features]
-default = ["dep:mime_guess"]
+default = ["dep:mime_guess2"]
## Shorthand for enabling the different types of image loaders (`file`, `http`, `image`, `svg`).
all_loaders = ["file", "http", "image", "svg"]
@@ -33,7 +33,7 @@ all_loaders = ["file", "http", "image", "svg"]
datepicker = ["chrono"]
## Add support for loading images from `file://` URIs.
-file = ["dep:mime_guess"]
+file = ["dep:mime_guess2"]
## Add support for loading images via HTTP.
http = ["dep:ehttp"]
@@ -83,7 +83,7 @@ document-features = { version = "0.2", optional = true }
image = { version = "0.24", optional = true, default-features = false }
# file feature
-mime_guess = { version = "2.0.4", optional = true, default-features = false }
+mime_guess2 = { version = "2", optional = true, default-features = false }
puffin = { version = "0.16", optional = true }
diff --git a/crates/egui_extras/src/loaders/file_loader.rs b/crates/egui_extras/src/loaders/file_loader.rs
index e86cb42f37b..31e6cf2ee0e 100644
--- a/crates/egui_extras/src/loaders/file_loader.rs
+++ b/crates/egui_extras/src/loaders/file_loader.rs
@@ -68,7 +68,7 @@ impl BytesLoader for FileLoader {
let result = match std::fs::read(&path) {
Ok(bytes) => {
#[cfg(feature = "mime_guess")]
- let mime = mime_guess::from_path(&path)
+ let mime = mime_guess2::from_path(&path)
.first_raw()
.map(|v| v.to_owned());
diff --git a/crates/epaint/src/text/text_layout.rs b/crates/epaint/src/text/text_layout.rs
index e36ee1eaa3a..9b055edc577 100644
--- a/crates/epaint/src/text/text_layout.rs
+++ b/crates/epaint/src/text/text_layout.rs
@@ -665,7 +665,7 @@ fn tessellate_row(
point_scale: PointScale,
job: &LayoutJob,
format_summary: &FormatSummary,
- row: &mut Row,
+ row: &Row,
) -> RowVisuals {
if row.glyphs.is_empty() {
return Default::default();
diff --git a/deny.toml b/deny.toml
index 96aec700902..5bca6c829d0 100644
--- a/deny.toml
+++ b/deny.toml
@@ -35,6 +35,7 @@ deny = [
skip = [
{ name = "arrayvec" }, # old version via tiny-skiaz
+ { name = "base64" }, # small crate, old version from usvg
{ name = "libloading" }, # wgpu-hal itself depends on 0.8 while some of its dependencies, like ash and d3d12, depend on 0.7
{ name = "memoffset" }, # tiny dependency
{ name = "nix" }, # old version via winit