From a99aa1dd61e15e28d93c0719037b6683f32e310e Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Tue, 26 Nov 2019 15:32:11 +0100
Subject: Fallback to embedded font when system font fails

---
 wgpu/src/text.rs | 36 +++++++++++++++++++++++++-----------
 1 file changed, 25 insertions(+), 11 deletions(-)

(limited to 'wgpu/src')

diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs
index bf37abe5..f29440c7 100644
--- a/wgpu/src/text.rs
+++ b/wgpu/src/text.rs
@@ -11,6 +11,8 @@ pub const BUILTIN_ICONS: iced_native::Font = iced_native::Font::External {
 
 pub const CHECKMARK_ICON: char = '\u{F00C}';
 
+const FALLBACK_FONT: &[u8] = include_bytes!("../fonts/Lato-Regular.ttf");
+
 #[derive(Debug)]
 pub struct Pipeline {
     draw_brush: RefCell<wgpu_glyph::GlyphBrush<'static, ()>>,
@@ -26,24 +28,36 @@ impl Pipeline {
 
         let default_font = font_source
             .load(&[font::Family::SansSerif, font::Family::Serif])
-            .expect("Find sans-serif or serif font");
+            .unwrap_or_else(|_| FALLBACK_FONT.to_vec());
 
         let mono_font = font_source
             .load(&[font::Family::Monospace])
-            .expect("Find monospace font");
+            .unwrap_or_else(|_| FALLBACK_FONT.to_vec());
+
+        let load_glyph_brush = |font: Vec<u8>| {
+            let builder =
+                wgpu_glyph::GlyphBrushBuilder::using_fonts_bytes(vec![
+                    mono_font.clone(),
+                    font.clone(),
+                ])?;
+
+            Ok((
+                builder,
+                glyph_brush::GlyphBrushBuilder::using_font_bytes(font).build(),
+            ))
+        };
+
+        let (brush_builder, measure_brush) = load_glyph_brush(default_font)
+            .unwrap_or_else(|_: wgpu_glyph::rusttype::Error| {
+                log::warn!("System font failed to load. Falling back to embedded font...");
 
-        let draw_brush =
-            wgpu_glyph::GlyphBrushBuilder::using_fonts_bytes(vec![
-                mono_font,
-                default_font.clone(),
-            ])
+                load_glyph_brush(FALLBACK_FONT.to_vec()).expect("Load fallback font")
+            });
+
+        let draw_brush = brush_builder
             .initial_cache_size((2048, 2048))
             .build(device, wgpu::TextureFormat::Bgra8UnormSrgb);
 
-        let measure_brush =
-            glyph_brush::GlyphBrushBuilder::using_font_bytes(default_font)
-                .build();
-
         Pipeline {
             draw_brush: RefCell::new(draw_brush),
             draw_font_map: RefCell::new(HashMap::new()),
-- 
cgit 


From 80a8a574712f1652c7311554ad358c5bc15d5515 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Tue, 26 Nov 2019 15:33:38 +0100
Subject: Stop loading a mono font just for the debug view

---
 wgpu/src/text.rs | 18 +++---------------
 1 file changed, 3 insertions(+), 15 deletions(-)

(limited to 'wgpu/src')

diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs
index f29440c7..e9a1602f 100644
--- a/wgpu/src/text.rs
+++ b/wgpu/src/text.rs
@@ -30,15 +30,10 @@ impl Pipeline {
             .load(&[font::Family::SansSerif, font::Family::Serif])
             .unwrap_or_else(|_| FALLBACK_FONT.to_vec());
 
-        let mono_font = font_source
-            .load(&[font::Family::Monospace])
-            .unwrap_or_else(|_| FALLBACK_FONT.to_vec());
-
         let load_glyph_brush = |font: Vec<u8>| {
             let builder =
                 wgpu_glyph::GlyphBrushBuilder::using_fonts_bytes(vec![
-                    mono_font.clone(),
-                    font.clone(),
+                    font.clone()
                 ])?;
 
             Ok((
@@ -109,14 +104,7 @@ impl Pipeline {
             text: content,
             scale: wgpu_glyph::Scale { x: size, y: size },
             bounds: (bounds.width, bounds.height),
-
-            // TODO: This is a bit hacky. We are loading the debug font as the
-            // first font in the `draw_brush`. The `measure_brush` does not
-            // contain this, hence we subtract 1.
-            //
-            // This should go away once we unify `draw_brush` and
-            // `measure_brush`.
-            font_id: wgpu_glyph::FontId(font_id - 1),
+            font_id: wgpu_glyph::FontId(font_id),
             ..Default::default()
         };
 
@@ -157,7 +145,7 @@ impl Pipeline {
 
     pub fn find_font(&self, font: iced_native::Font) -> wgpu_glyph::FontId {
         match font {
-            iced_native::Font::Default => wgpu_glyph::FontId(1),
+            iced_native::Font::Default => wgpu_glyph::FontId(0),
             iced_native::Font::External { name, bytes } => {
                 if let Some(font_id) = self.draw_font_map.borrow().get(name) {
                     return *font_id;
-- 
cgit 


From 67570a0a1de7df8d26a2e2a8c7c309f4d4599631 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Sun, 1 Dec 2019 19:03:05 +0100
Subject: Add `repr(C)` to GPU types

---
 wgpu/src/image.rs | 2 ++
 wgpu/src/quad.rs  | 2 ++
 2 files changed, 4 insertions(+)

(limited to 'wgpu/src')

diff --git a/wgpu/src/image.rs b/wgpu/src/image.rs
index 5dc972ac..40d9c318 100644
--- a/wgpu/src/image.rs
+++ b/wgpu/src/image.rs
@@ -427,6 +427,7 @@ pub struct Image {
     pub scale: [f32; 2],
 }
 
+#[repr(C)]
 #[derive(Clone, Copy)]
 pub struct Vertex {
     _position: [f32; 2],
@@ -449,6 +450,7 @@ const QUAD_VERTS: [Vertex; 4] = [
     },
 ];
 
+#[repr(C)]
 #[derive(Clone, Copy)]
 struct Instance {
     _position: [f32; 2],
diff --git a/wgpu/src/quad.rs b/wgpu/src/quad.rs
index 3d797758..c292dec3 100644
--- a/wgpu/src/quad.rs
+++ b/wgpu/src/quad.rs
@@ -248,6 +248,7 @@ impl Pipeline {
     }
 }
 
+#[repr(C)]
 #[derive(Clone, Copy)]
 pub struct Vertex {
     _position: [f32; 2],
@@ -270,6 +271,7 @@ const QUAD_VERTS: [Vertex; 4] = [
     },
 ];
 
+#[repr(C)]
 #[derive(Debug, Clone, Copy)]
 pub struct Quad {
     pub position: [f32; 2],
-- 
cgit 


From e648de560dd7372626dfce33bf508e9d41da6409 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Sun, 1 Dec 2019 23:36:29 +0100
Subject: Use `PowerPreference::Default` in `iced_wgpu`

---
 wgpu/src/renderer.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'wgpu/src')

diff --git a/wgpu/src/renderer.rs b/wgpu/src/renderer.rs
index f27a4b8a..268a3630 100644
--- a/wgpu/src/renderer.rs
+++ b/wgpu/src/renderer.rs
@@ -49,7 +49,7 @@ impl<'a> Layer<'a> {
 impl Renderer {
     fn new() -> Self {
         let adapter = Adapter::request(&RequestAdapterOptions {
-            power_preference: PowerPreference::LowPower,
+            power_preference: PowerPreference::Default,
             backends: BackendBit::all(),
         })
         .expect("Request adapter");
-- 
cgit 


From 5eec3a8867f4fbd54e2e28e5d984c2ca7ec0fea4 Mon Sep 17 00:00:00 2001
From: Friz64 <friz64@arch.localdomain>
Date: Mon, 25 Nov 2019 20:27:15 +0100
Subject: First implementation

---
 wgpu/src/renderer/widget/scrollable.rs | 84 ++++++++++++++++++++++++----------
 1 file changed, 60 insertions(+), 24 deletions(-)

(limited to 'wgpu/src')

diff --git a/wgpu/src/renderer/widget/scrollable.rs b/wgpu/src/renderer/widget/scrollable.rs
index 58dc3df9..d069b799 100644
--- a/wgpu/src/renderer/widget/scrollable.rs
+++ b/wgpu/src/renderer/widget/scrollable.rs
@@ -1,12 +1,13 @@
 use crate::{Primitive, Renderer};
 use iced_native::{
-    scrollable, Background, MouseCursor, Point, Rectangle, Vector,
+    scrollable, Background, MouseCursor, Point, Rectangle, ScrollbarGrab,
+    Vector,
 };
 
 const SCROLLBAR_WIDTH: u16 = 10;
 const SCROLLBAR_MARGIN: u16 = 2;
 
-fn scrollbar_bounds(bounds: Rectangle) -> Rectangle {
+fn background_bounds(bounds: Rectangle) -> Rectangle {
     Rectangle {
         x: bounds.x + bounds.width
             - f32::from(SCROLLBAR_WIDTH + 2 * SCROLLBAR_MARGIN),
@@ -16,15 +17,53 @@ fn scrollbar_bounds(bounds: Rectangle) -> Rectangle {
     }
 }
 
+fn scroller_bounds(
+    bounds: Rectangle,
+    content_bounds: Rectangle,
+    background_bounds: Rectangle,
+    offset: u32,
+) -> Rectangle {
+    let ratio = bounds.height / content_bounds.height;
+    let scrollbar_height = bounds.height * ratio;
+    let y_offset = offset as f32 * ratio;
+
+    Rectangle {
+        x: background_bounds.x + f32::from(SCROLLBAR_MARGIN),
+        y: background_bounds.y + y_offset,
+        width: background_bounds.width - f32::from(2 * SCROLLBAR_MARGIN),
+        height: scrollbar_height,
+    }
+}
+
 impl scrollable::Renderer for Renderer {
-    fn is_mouse_over_scrollbar(
+    fn scrollbar_grab(
         &self,
         bounds: Rectangle,
         content_bounds: Rectangle,
+        offset: u32,
         cursor_position: Point,
-    ) -> bool {
-        content_bounds.height > bounds.height
-            && scrollbar_bounds(bounds).contains(cursor_position)
+    ) -> Option<(ScrollbarGrab, Rectangle)> {
+        let background_bounds = background_bounds(bounds);
+        if content_bounds.height > bounds.height
+            && background_bounds.contains(cursor_position)
+        {
+            let scroller_bounds = scroller_bounds(
+                bounds,
+                content_bounds,
+                background_bounds,
+                offset,
+            );
+
+            let scrollbar_grab = if scroller_bounds.contains(cursor_position) {
+                ScrollbarGrab::Scroller
+            } else {
+                ScrollbarGrab::Background
+            };
+
+            Some((scrollbar_grab, scroller_bounds))
+        } else {
+            None
+        }
     }
 
     fn draw(
@@ -38,7 +77,7 @@ impl scrollable::Renderer for Renderer {
         (content, mouse_cursor): Self::Output,
     ) -> Self::Output {
         let is_content_overflowing = content_bounds.height > bounds.height;
-        let scrollbar_bounds = scrollbar_bounds(bounds);
+        let background_bounds = background_bounds(bounds);
 
         let clip = Primitive::Clip {
             bounds,
@@ -48,31 +87,28 @@ impl scrollable::Renderer for Renderer {
 
         (
             if is_content_overflowing
-                && (is_mouse_over || state.is_scrollbar_grabbed())
+                && (is_mouse_over || state.currently_grabbed())
             {
-                let ratio = bounds.height / content_bounds.height;
-                let scrollbar_height = bounds.height * ratio;
-                let y_offset = offset as f32 * ratio;
-
+                let scroller_bounds = scroller_bounds(
+                    bounds,
+                    content_bounds,
+                    background_bounds,
+                    offset,
+                );
                 let scrollbar = Primitive::Quad {
-                    bounds: Rectangle {
-                        x: scrollbar_bounds.x + f32::from(SCROLLBAR_MARGIN),
-                        y: scrollbar_bounds.y + y_offset,
-                        width: scrollbar_bounds.width
-                            - f32::from(2 * SCROLLBAR_MARGIN),
-                        height: scrollbar_height,
-                    },
+                    bounds: scroller_bounds,
                     background: Background::Color([0.0, 0.0, 0.0, 0.7].into()),
                     border_radius: 5,
                 };
 
-                if is_mouse_over_scrollbar || state.is_scrollbar_grabbed() {
+                if is_mouse_over_scrollbar || state.currently_grabbed() {
                     let scrollbar_background = Primitive::Quad {
                         bounds: Rectangle {
-                            x: scrollbar_bounds.x + f32::from(SCROLLBAR_MARGIN),
-                            width: scrollbar_bounds.width
+                            x: background_bounds.x
+                                + f32::from(SCROLLBAR_MARGIN),
+                            width: background_bounds.width
                                 - f32::from(2 * SCROLLBAR_MARGIN),
-                            ..scrollbar_bounds
+                            ..background_bounds
                         },
                         background: Background::Color(
                             [0.0, 0.0, 0.0, 0.3].into(),
@@ -91,7 +127,7 @@ impl scrollable::Renderer for Renderer {
             } else {
                 clip
             },
-            if is_mouse_over_scrollbar || state.is_scrollbar_grabbed() {
+            if is_mouse_over_scrollbar || state.currently_grabbed() {
                 MouseCursor::Idle
             } else {
                 mouse_cursor
-- 
cgit 


From f8fac432c665e57267243a9ee3920208b2724e6e Mon Sep 17 00:00:00 2001
From: Friz64 <friz64mc@gmail.com>
Date: Sat, 30 Nov 2019 17:30:42 +0100
Subject: Finalize work

---
 wgpu/src/renderer/widget/scrollable.rs | 32 ++++++++++++++++++--------------
 1 file changed, 18 insertions(+), 14 deletions(-)

(limited to 'wgpu/src')

diff --git a/wgpu/src/renderer/widget/scrollable.rs b/wgpu/src/renderer/widget/scrollable.rs
index d069b799..175fac11 100644
--- a/wgpu/src/renderer/widget/scrollable.rs
+++ b/wgpu/src/renderer/widget/scrollable.rs
@@ -36,31 +36,35 @@ fn scroller_bounds(
 }
 
 impl scrollable::Renderer for Renderer {
-    fn scrollbar_grab(
+    fn scrollbar_bounds(
         &self,
         bounds: Rectangle,
         content_bounds: Rectangle,
         offset: u32,
-        cursor_position: Point,
-    ) -> Option<(ScrollbarGrab, Rectangle)> {
+    ) -> (Rectangle, Rectangle) {
         let background_bounds = background_bounds(bounds);
+        let scroller_bounds =
+            scroller_bounds(bounds, content_bounds, background_bounds, offset);
+
+        (background_bounds, scroller_bounds)
+    }
+
+    fn scrollbar_grab(
+        &self,
+        bounds: Rectangle,
+        content_bounds: Rectangle,
+        background_bounds: Rectangle,
+        scroller_bounds: Rectangle,
+        cursor_position: Point,
+    ) -> Option<ScrollbarGrab> {
         if content_bounds.height > bounds.height
             && background_bounds.contains(cursor_position)
         {
-            let scroller_bounds = scroller_bounds(
-                bounds,
-                content_bounds,
-                background_bounds,
-                offset,
-            );
-
-            let scrollbar_grab = if scroller_bounds.contains(cursor_position) {
+            Some(if scroller_bounds.contains(cursor_position) {
                 ScrollbarGrab::Scroller
             } else {
                 ScrollbarGrab::Background
-            };
-
-            Some((scrollbar_grab, scroller_bounds))
+            })
         } else {
             None
         }
-- 
cgit 


From 6943041e0fad65927a741e316509bf07bdaa2f61 Mon Sep 17 00:00:00 2001
From: Friz64 <friz64mc@gmail.com>
Date: Mon, 2 Dec 2019 18:51:34 +0100
Subject: Address suggestions

---
 wgpu/src/renderer/widget/scrollable.rs | 102 ++++++++++-----------------------
 1 file changed, 29 insertions(+), 73 deletions(-)

(limited to 'wgpu/src')

diff --git a/wgpu/src/renderer/widget/scrollable.rs b/wgpu/src/renderer/widget/scrollable.rs
index 175fac11..b83cee1b 100644
--- a/wgpu/src/renderer/widget/scrollable.rs
+++ b/wgpu/src/renderer/widget/scrollable.rs
@@ -1,72 +1,34 @@
 use crate::{Primitive, Renderer};
-use iced_native::{
-    scrollable, Background, MouseCursor, Point, Rectangle, ScrollbarGrab,
-    Vector,
-};
+use iced_native::{scrollable, Background, MouseCursor, Rectangle, Vector};
 
 const SCROLLBAR_WIDTH: u16 = 10;
 const SCROLLBAR_MARGIN: u16 = 2;
 
-fn background_bounds(bounds: Rectangle) -> Rectangle {
-    Rectangle {
-        x: bounds.x + bounds.width
-            - f32::from(SCROLLBAR_WIDTH + 2 * SCROLLBAR_MARGIN),
-        y: bounds.y,
-        width: f32::from(SCROLLBAR_WIDTH + 2 * SCROLLBAR_MARGIN),
-        height: bounds.height,
-    }
-}
-
-fn scroller_bounds(
-    bounds: Rectangle,
-    content_bounds: Rectangle,
-    background_bounds: Rectangle,
-    offset: u32,
-) -> Rectangle {
-    let ratio = bounds.height / content_bounds.height;
-    let scrollbar_height = bounds.height * ratio;
-    let y_offset = offset as f32 * ratio;
-
-    Rectangle {
-        x: background_bounds.x + f32::from(SCROLLBAR_MARGIN),
-        y: background_bounds.y + y_offset,
-        width: background_bounds.width - f32::from(2 * SCROLLBAR_MARGIN),
-        height: scrollbar_height,
-    }
-}
-
 impl scrollable::Renderer for Renderer {
-    fn scrollbar_bounds(
-        &self,
-        bounds: Rectangle,
-        content_bounds: Rectangle,
-        offset: u32,
-    ) -> (Rectangle, Rectangle) {
-        let background_bounds = background_bounds(bounds);
-        let scroller_bounds =
-            scroller_bounds(bounds, content_bounds, background_bounds, offset);
-
-        (background_bounds, scroller_bounds)
+    fn scrollbar_bounds(bounds: Rectangle) -> Rectangle {
+        Rectangle {
+            x: bounds.x + bounds.width
+                - f32::from(SCROLLBAR_WIDTH + 2 * SCROLLBAR_MARGIN),
+            y: bounds.y,
+            width: f32::from(SCROLLBAR_WIDTH + 2 * SCROLLBAR_MARGIN),
+            height: bounds.height,
+        }
     }
 
-    fn scrollbar_grab(
-        &self,
+    fn scroller_bounds(
         bounds: Rectangle,
         content_bounds: Rectangle,
-        background_bounds: Rectangle,
-        scroller_bounds: Rectangle,
-        cursor_position: Point,
-    ) -> Option<ScrollbarGrab> {
-        if content_bounds.height > bounds.height
-            && background_bounds.contains(cursor_position)
-        {
-            Some(if scroller_bounds.contains(cursor_position) {
-                ScrollbarGrab::Scroller
-            } else {
-                ScrollbarGrab::Background
-            })
-        } else {
-            None
+        scrollbar_bounds: Rectangle,
+        offset: u32,
+    ) -> Rectangle {
+        let ratio = bounds.height / content_bounds.height;
+        let scrollbar_height = bounds.height * ratio;
+        let y_offset = offset as f32 * ratio;
+        Rectangle {
+            x: scrollbar_bounds.x + f32::from(SCROLLBAR_MARGIN),
+            y: scrollbar_bounds.y + y_offset,
+            width: scrollbar_bounds.width - f32::from(2 * SCROLLBAR_MARGIN),
+            height: scrollbar_height,
         }
     }
 
@@ -77,11 +39,12 @@ impl scrollable::Renderer for Renderer {
         content_bounds: Rectangle,
         is_mouse_over: bool,
         is_mouse_over_scrollbar: bool,
+        scrollbar_bounds: Rectangle,
+        scroller_bounds: Rectangle,
         offset: u32,
         (content, mouse_cursor): Self::Output,
     ) -> Self::Output {
         let is_content_overflowing = content_bounds.height > bounds.height;
-        let background_bounds = background_bounds(bounds);
 
         let clip = Primitive::Clip {
             bounds,
@@ -91,28 +54,21 @@ impl scrollable::Renderer for Renderer {
 
         (
             if is_content_overflowing
-                && (is_mouse_over || state.currently_grabbed())
+                && (is_mouse_over || state.is_scroller_grabbed())
             {
-                let scroller_bounds = scroller_bounds(
-                    bounds,
-                    content_bounds,
-                    background_bounds,
-                    offset,
-                );
                 let scrollbar = Primitive::Quad {
                     bounds: scroller_bounds,
                     background: Background::Color([0.0, 0.0, 0.0, 0.7].into()),
                     border_radius: 5,
                 };
 
-                if is_mouse_over_scrollbar || state.currently_grabbed() {
+                if is_mouse_over_scrollbar || state.is_scroller_grabbed() {
                     let scrollbar_background = Primitive::Quad {
                         bounds: Rectangle {
-                            x: background_bounds.x
-                                + f32::from(SCROLLBAR_MARGIN),
-                            width: background_bounds.width
+                            x: scrollbar_bounds.x + f32::from(SCROLLBAR_MARGIN),
+                            width: scrollbar_bounds.width
                                 - f32::from(2 * SCROLLBAR_MARGIN),
-                            ..background_bounds
+                            ..scrollbar_bounds
                         },
                         background: Background::Color(
                             [0.0, 0.0, 0.0, 0.3].into(),
@@ -131,7 +87,7 @@ impl scrollable::Renderer for Renderer {
             } else {
                 clip
             },
-            if is_mouse_over_scrollbar || state.currently_grabbed() {
+            if is_mouse_over_scrollbar || state.is_scroller_grabbed() {
                 MouseCursor::Idle
             } else {
                 mouse_cursor
-- 
cgit 


From 31e3b6fbcb06bd5e1e5773a7c2febd0cb0092819 Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Tue, 3 Dec 2019 06:48:29 +0100
Subject: Unify logic by introducing `scrollable::Scrollbar`

---
 wgpu/src/renderer/widget/scrollable.rs | 110 ++++++++++++++++++---------------
 1 file changed, 61 insertions(+), 49 deletions(-)

(limited to 'wgpu/src')

diff --git a/wgpu/src/renderer/widget/scrollable.rs b/wgpu/src/renderer/widget/scrollable.rs
index b83cee1b..6ef57185 100644
--- a/wgpu/src/renderer/widget/scrollable.rs
+++ b/wgpu/src/renderer/widget/scrollable.rs
@@ -5,30 +5,40 @@ const SCROLLBAR_WIDTH: u16 = 10;
 const SCROLLBAR_MARGIN: u16 = 2;
 
 impl scrollable::Renderer for Renderer {
-    fn scrollbar_bounds(bounds: Rectangle) -> Rectangle {
-        Rectangle {
-            x: bounds.x + bounds.width
-                - f32::from(SCROLLBAR_WIDTH + 2 * SCROLLBAR_MARGIN),
-            y: bounds.y,
-            width: f32::from(SCROLLBAR_WIDTH + 2 * SCROLLBAR_MARGIN),
-            height: bounds.height,
-        }
-    }
-
-    fn scroller_bounds(
+    fn scrollbar(
+        &self,
         bounds: Rectangle,
         content_bounds: Rectangle,
-        scrollbar_bounds: Rectangle,
         offset: u32,
-    ) -> Rectangle {
-        let ratio = bounds.height / content_bounds.height;
-        let scrollbar_height = bounds.height * ratio;
-        let y_offset = offset as f32 * ratio;
-        Rectangle {
-            x: scrollbar_bounds.x + f32::from(SCROLLBAR_MARGIN),
-            y: scrollbar_bounds.y + y_offset,
-            width: scrollbar_bounds.width - f32::from(2 * SCROLLBAR_MARGIN),
-            height: scrollbar_height,
+    ) -> Option<scrollable::Scrollbar> {
+        if content_bounds.height > bounds.height {
+            let scrollbar_bounds = Rectangle {
+                x: bounds.x + bounds.width
+                    - f32::from(SCROLLBAR_WIDTH + 2 * SCROLLBAR_MARGIN),
+                y: bounds.y,
+                width: f32::from(SCROLLBAR_WIDTH + 2 * SCROLLBAR_MARGIN),
+                height: bounds.height,
+            };
+
+            let ratio = bounds.height / content_bounds.height;
+            let scrollbar_height = bounds.height * ratio;
+            let y_offset = offset as f32 * ratio;
+
+            let scroller_bounds = Rectangle {
+                x: scrollbar_bounds.x + f32::from(SCROLLBAR_MARGIN),
+                y: scrollbar_bounds.y + y_offset,
+                width: scrollbar_bounds.width - f32::from(2 * SCROLLBAR_MARGIN),
+                height: scrollbar_height,
+            };
+
+            Some(scrollable::Scrollbar {
+                bounds: scrollbar_bounds,
+                scroller: scrollable::Scroller {
+                    bounds: scroller_bounds,
+                },
+            })
+        } else {
+            None
         }
     }
 
@@ -36,16 +46,13 @@ impl scrollable::Renderer for Renderer {
         &mut self,
         state: &scrollable::State,
         bounds: Rectangle,
-        content_bounds: Rectangle,
+        _content_bounds: Rectangle,
         is_mouse_over: bool,
         is_mouse_over_scrollbar: bool,
-        scrollbar_bounds: Rectangle,
-        scroller_bounds: Rectangle,
+        scrollbar: Option<scrollable::Scrollbar>,
         offset: u32,
         (content, mouse_cursor): Self::Output,
     ) -> Self::Output {
-        let is_content_overflowing = content_bounds.height > bounds.height;
-
         let clip = Primitive::Clip {
             bounds,
             offset: Vector::new(0, offset),
@@ -53,36 +60,41 @@ impl scrollable::Renderer for Renderer {
         };
 
         (
-            if is_content_overflowing
-                && (is_mouse_over || state.is_scroller_grabbed())
-            {
-                let scrollbar = Primitive::Quad {
-                    bounds: scroller_bounds,
-                    background: Background::Color([0.0, 0.0, 0.0, 0.7].into()),
-                    border_radius: 5,
-                };
-
-                if is_mouse_over_scrollbar || state.is_scroller_grabbed() {
-                    let scrollbar_background = Primitive::Quad {
-                        bounds: Rectangle {
-                            x: scrollbar_bounds.x + f32::from(SCROLLBAR_MARGIN),
-                            width: scrollbar_bounds.width
-                                - f32::from(2 * SCROLLBAR_MARGIN),
-                            ..scrollbar_bounds
-                        },
+            if let Some(scrollbar) = scrollbar {
+                if is_mouse_over || state.is_scroller_grabbed() {
+                    let scroller = Primitive::Quad {
+                        bounds: scrollbar.scroller.bounds,
                         background: Background::Color(
-                            [0.0, 0.0, 0.0, 0.3].into(),
+                            [0.0, 0.0, 0.0, 0.7].into(),
                         ),
                         border_radius: 5,
                     };
 
-                    Primitive::Group {
-                        primitives: vec![clip, scrollbar_background, scrollbar],
+                    if is_mouse_over_scrollbar || state.is_scroller_grabbed() {
+                        let scrollbar = Primitive::Quad {
+                            bounds: Rectangle {
+                                x: scrollbar.bounds.x
+                                    + f32::from(SCROLLBAR_MARGIN),
+                                width: scrollbar.bounds.width
+                                    - f32::from(2 * SCROLLBAR_MARGIN),
+                                ..scrollbar.bounds
+                            },
+                            background: Background::Color(
+                                [0.0, 0.0, 0.0, 0.3].into(),
+                            ),
+                            border_radius: 5,
+                        };
+
+                        Primitive::Group {
+                            primitives: vec![clip, scrollbar, scroller],
+                        }
+                    } else {
+                        Primitive::Group {
+                            primitives: vec![clip, scroller],
+                        }
                     }
                 } else {
-                    Primitive::Group {
-                        primitives: vec![clip, scrollbar],
-                    }
+                    clip
                 }
             } else {
                 clip
-- 
cgit 


From 0b5409c53d2563825d5f36bcae9700ec8721c34e Mon Sep 17 00:00:00 2001
From: Héctor Ramón Jiménez <hector0193@gmail.com>
Date: Tue, 3 Dec 2019 07:40:56 +0100
Subject: Fix `TextInput` inner border radius in `iced_wgpu`

---
 wgpu/src/renderer/widget/text_input.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'wgpu/src')

diff --git a/wgpu/src/renderer/widget/text_input.rs b/wgpu/src/renderer/widget/text_input.rs
index 9ed3b415..d64fca6d 100644
--- a/wgpu/src/renderer/widget/text_input.rs
+++ b/wgpu/src/renderer/widget/text_input.rs
@@ -45,7 +45,7 @@ impl text_input::Renderer for Renderer {
                 height: bounds.height - 2.0,
             },
             background: Background::Color(Color::WHITE),
-            border_radius: 5,
+            border_radius: 4,
         };
 
         let size = f32::from(size);
-- 
cgit