diff --git a/crates/gpui/examples/image/color.svg b/crates/gpui/examples/image/color.svg
index 84e9809d09492a..a080681b0e6fe1 100644
--- a/crates/gpui/examples/image/color.svg
+++ b/crates/gpui/examples/image/color.svg
@@ -6,8 +6,8 @@
-
+
-
-
\ No newline at end of file
+
+
diff --git a/crates/gpui/src/color.rs b/crates/gpui/src/color.rs
index 6a1f375b651d42..9c831d0875588c 100644
--- a/crates/gpui/src/color.rs
+++ b/crates/gpui/src/color.rs
@@ -22,6 +22,17 @@ pub fn rgba(hex: u32) -> Rgba {
Rgba { r, g, b, a }
}
+/// Swap from RGBA with premultiplied alpha to BGRA
+pub(crate) fn swap_rgba_pa_to_bgra(color: &mut [u8]) {
+ color.swap(0, 2);
+ if color[3] > 0 {
+ let a = color[3] as f32 / 255.;
+ color[0] = (color[0] as f32 / a) as u8;
+ color[1] = (color[1] as f32 / a) as u8;
+ color[2] = (color[2] as f32 / a) as u8;
+ }
+}
+
/// An RGBA color
#[derive(PartialEq, Clone, Copy, Default)]
pub struct Rgba {
diff --git a/crates/gpui/src/elements/img.rs b/crates/gpui/src/elements/img.rs
index 4e326720955f6a..895904c8012cb8 100644
--- a/crates/gpui/src/elements/img.rs
+++ b/crates/gpui/src/elements/img.rs
@@ -1,8 +1,8 @@
use crate::{
- px, AbsoluteLength, AnyElement, AppContext, Asset, AssetLogger, Bounds, DefiniteLength,
- Element, ElementId, GlobalElementId, Hitbox, Image, InteractiveElement, Interactivity,
- IntoElement, LayoutId, Length, ObjectFit, Pixels, RenderImage, Resource, SharedString,
- SharedUri, StyleRefinement, Styled, SvgSize, Task, WindowContext,
+ px, swap_rgba_pa_to_bgra, AbsoluteLength, AnyElement, AppContext, Asset, AssetLogger, Bounds,
+ DefiniteLength, Element, ElementId, GlobalElementId, Hitbox, Image, InteractiveElement,
+ Interactivity, IntoElement, LayoutId, Length, ObjectFit, Pixels, RenderImage, Resource,
+ SharedString, SharedUri, StyleRefinement, Styled, SvgSize, Task, WindowContext,
};
use anyhow::{anyhow, Result};
@@ -564,9 +564,8 @@ impl Asset for ImageAssetLoader {
let mut buffer =
ImageBuffer::from_raw(pixmap.width(), pixmap.height(), pixmap.take()).unwrap();
- // Convert from RGBA to BGRA.
for pixel in buffer.chunks_exact_mut(4) {
- pixel.swap(0, 2);
+ swap_rgba_pa_to_bgra(pixel);
}
RenderImage::new(SmallVec::from_elem(Frame::new(buffer), 1))
diff --git a/crates/gpui/src/platform/mac/text_system.rs b/crates/gpui/src/platform/mac/text_system.rs
index 3db1bf9bcd52b3..560c78ffb29f40 100644
--- a/crates/gpui/src/platform/mac/text_system.rs
+++ b/crates/gpui/src/platform/mac/text_system.rs
@@ -1,7 +1,8 @@
use crate::{
- point, px, size, Bounds, DevicePixels, Font, FontFallbacks, FontFeatures, FontId, FontMetrics,
- FontRun, FontStyle, FontWeight, GlyphId, LineLayout, Pixels, PlatformTextSystem, Point,
- RenderGlyphParams, Result, ShapedGlyph, ShapedRun, SharedString, Size, SUBPIXEL_VARIANTS,
+ point, px, size, swap_rgba_pa_to_bgra, Bounds, DevicePixels, Font, FontFallbacks, FontFeatures,
+ FontId, FontMetrics, FontRun, FontStyle, FontWeight, GlyphId, LineLayout, Pixels,
+ PlatformTextSystem, Point, RenderGlyphParams, Result, ShapedGlyph, ShapedRun, SharedString,
+ Size, SUBPIXEL_VARIANTS,
};
use anyhow::anyhow;
use cocoa::appkit::CGFloat;
@@ -418,11 +419,7 @@ impl MacTextSystemState {
if params.is_emoji {
// Convert from RGBA with premultiplied alpha to BGRA with straight alpha.
for pixel in bytes.chunks_exact_mut(4) {
- pixel.swap(0, 2);
- let a = pixel[3] as f32 / 255.;
- pixel[0] = (pixel[0] as f32 / a) as u8;
- pixel[1] = (pixel[1] as f32 / a) as u8;
- pixel[2] = (pixel[2] as f32 / a) as u8;
+ swap_rgba_pa_to_bgra(pixel);
}
}