Allow distinct corner radii for images

Nathan Sobo created

Change summary

crates/gpui/src/elements/image.rs                  |  2 +-
crates/gpui/src/platform/mac/renderer.rs           | 12 +++++++++---
crates/gpui/src/platform/mac/shaders/shaders.h     |  5 ++++-
crates/gpui/src/platform/mac/shaders/shaders.metal |  8 ++++----
crates/gpui/src/scene.rs                           |  5 +++--
5 files changed, 21 insertions(+), 11 deletions(-)

Detailed changes

crates/gpui/src/elements/image.rs 🔗

@@ -103,7 +103,7 @@ impl<V: View> Element<V> for Image {
             scene.push_image(scene::Image {
                 bounds,
                 border: self.style.border,
-                corner_radius: self.style.corner_radius,
+                corner_radii: self.style.corner_radius.into(),
                 grayscale: self.style.grayscale,
                 data: data.clone(),
             });

crates/gpui/src/platform/mac/renderer.rs 🔗

@@ -741,7 +741,7 @@ impl Renderer {
         for image in images {
             let origin = image.bounds.origin() * scale_factor;
             let target_size = image.bounds.size() * scale_factor;
-            let corner_radius = image.corner_radius * scale_factor;
+            let corner_radii = image.corner_radii * scale_factor;
             let border_width = image.border.width * scale_factor;
             let (alloc_id, atlas_bounds) = self.image_cache.render(&image.data);
             images_by_atlas
@@ -757,7 +757,10 @@ impl Renderer {
                     border_bottom: border_width * (image.border.bottom as usize as f32),
                     border_left: border_width * (image.border.left as usize as f32),
                     border_color: image.border.color.to_uchar4(),
-                    corner_radius,
+                    corner_radius_top_left: corner_radii.top_left,
+                    corner_radius_top_right: corner_radii.top_right,
+                    corner_radius_bottom_right: corner_radii.bottom_right,
+                    corner_radius_bottom_left: corner_radii.bottom_left,
                     grayscale: image.grayscale as u8,
                 });
         }
@@ -780,7 +783,10 @@ impl Renderer {
                         border_bottom: 0.,
                         border_left: 0.,
                         border_color: Default::default(),
-                        corner_radius: 0.,
+                        corner_radius_top_left: 0.,
+                        corner_radius_top_right: 0.,
+                        corner_radius_bottom_right: 0.,
+                        corner_radius_bottom_left: 0.,
                         grayscale: false as u8,
                     });
             } else {

crates/gpui/src/platform/mac/shaders/shaders.h 🔗

@@ -92,7 +92,10 @@ typedef struct {
   float border_bottom;
   float border_left;
   vector_uchar4 border_color;
-  float corner_radius;
+  float corner_radius_top_left;
+  float corner_radius_top_right;
+  float corner_radius_bottom_right;
+  float corner_radius_bottom_left;
   uint8_t grayscale;
 } GPUIImage;
 

crates/gpui/src/platform/mac/shaders/shaders.metal 🔗

@@ -273,10 +273,10 @@ vertex QuadFragmentInput image_vertex(
         image.border_bottom,
         image.border_left,
         coloru_to_colorf(image.border_color),
-        image.corner_radius,
-        image.corner_radius,
-        image.corner_radius,
-        image.corner_radius,
+        image.corner_radius_top_left,
+        image.corner_radius_top_right,
+        image.corner_radius_bottom_right,
+        image.corner_radius_bottom_left,
         image.grayscale,
     };
 }

crates/gpui/src/scene.rs 🔗

@@ -3,6 +3,7 @@ mod mouse_region;
 
 #[cfg(debug_assertions)]
 use collections::HashSet;
+use derive_more::Mul;
 use schemars::JsonSchema;
 use serde::Deserialize;
 use serde_json::json;
@@ -68,7 +69,7 @@ pub struct Quad {
     pub corner_radii: CornerRadii,
 }
 
-#[derive(Default, Debug)]
+#[derive(Default, Debug, Mul, Clone, Copy)]
 pub struct CornerRadii {
     pub top_left: f32,
     pub top_right: f32,
@@ -196,7 +197,7 @@ pub struct PathVertex {
 pub struct Image {
     pub bounds: RectF,
     pub border: Border,
-    pub corner_radius: f32,
+    pub corner_radii: CornerRadii,
     pub grayscale: bool,
     pub data: Arc<ImageData>,
 }