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); } }