Skip to content

Commit

Permalink
gpui: Fix SVG color render, when color have alpha (#20537)
Browse files Browse the repository at this point in the history
Release Notes:

- N/A


## Demo

- [Source
SVG](https://github.com/user-attachments/assets/1c681e01-baba-4613-a3e7-ea5cb3015406)
click here open in browser.

| Before | After |
| --- | --- |
| <img width="1212" alt="image"
src="https://github.com/user-attachments/assets/ba323b13-538b-4a34-bb64-9dcf490aface">
| <img width="1212" alt="image"
src="https://github.com/user-attachments/assets/4635926a-843e-426d-89a1-4e9b4f4cc37e">
|

---------

Co-authored-by: Floyd Wang <gassnake999@gmail.com>
  • Loading branch information
huacnlee and madcodelife authored Nov 16, 2024
1 parent 65a9c8d commit 932c7e2
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 17 deletions.
6 changes: 3 additions & 3 deletions crates/gpui/examples/image/color.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 11 additions & 0 deletions crates/gpui/src/color.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
11 changes: 5 additions & 6 deletions crates/gpui/src/elements/img.rs
Original file line number Diff line number Diff line change
@@ -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};

Expand Down Expand Up @@ -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))
Expand Down
13 changes: 5 additions & 8 deletions crates/gpui/src/platform/mac/text_system.rs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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);
}
}

Expand Down

0 comments on commit 932c7e2

Please sign in to comment.