From 7400b60540a3e66f408d75fb119f799f2298c57a Mon Sep 17 00:00:00 2001
From: StarArawn <toasterthegamer@gmail.com>
Date: Sat, 18 Dec 2021 07:55:10 -0500
Subject: [PATCH] Fixed up DPI scaling issues.

---
 README.md                                     | 11 ++++++-----
 .../src/render/unified/font/extract.rs        |  1 +
 .../src/render/unified/image/extract.rs       |  3 ++-
 bevy_kayak_ui/src/render/unified/mod.rs       | 19 ++++++++++++++-----
 .../src/render/unified/nine_patch/extract.rs  |  4 +++-
 .../src/render/unified/quad/extract.rs        |  4 ++--
 6 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/README.md b/README.md
index 69570f4..e2dd0de 100644
--- a/README.md
+++ b/README.md
@@ -18,11 +18,13 @@ Kayak UI is in the very early stages of development. Important features are miss
 ## Features
 - Easy to use declarative syntax using a custom proc macro
 - Basic widget and global state management
-- Input events
+- Input events (Mouse, Keyboard, Char)
 - Fast and accurate layouts using morphorm: https://github.com/geom3trik/morphorm
 - A few default widgets check out [kayak_widgets](./kayak_widgets)!
 - Style system built to kind of mimic CSS styles.
 - Image and Nine patch rendering.
+- Vec widgets see vec_widget example!
+- Removal of widgets.
 
 ## Bevy Renderer Features
 - Image and NinePatch renderer
@@ -30,13 +32,12 @@ Kayak UI is in the very early stages of development. Important features are miss
 - Quad renderer with rounded corners.
 - Custom UI node to ensure UI renders on top of 3D and 2D entities.
 - Fully integrated into bevy to capture input events, use bevy assets(images, etc).
+- Dpi Scaling
 
 ## Missing features
-- Widget diffing see issue: https://github.com/StarArawn/kayak_ui/issues/1
-- Removal of widgets.
+- Widget prop diffing see issue: https://github.com/StarArawn/kayak_ui/issues/1
 - More default widgets.
-- More events(keyboard events, etc)
-- Vec widgets IE: `{some_vec.map(|my_string| <Text content={my_string} />)}`
+- More events
 
 ## Example Screenshot
 <img src="images/screen1.png" alt="Kayak UI" width="600" />
diff --git a/bevy_kayak_ui/src/render/unified/font/extract.rs b/bevy_kayak_ui/src/render/unified/font/extract.rs
index c134581..783d149 100644
--- a/bevy_kayak_ui/src/render/unified/font/extract.rs
+++ b/bevy_kayak_ui/src/render/unified/font/extract.rs
@@ -17,6 +17,7 @@ pub fn extract_texts(
     render_primitive: &RenderPrimitive,
     fonts: &Res<Assets<KayakFont>>,
     font_mapping: &Res<FontMapping>,
+    _dpi: f32,
 ) -> Vec<ExtractQuadBundle> {
     let mut extracted_texts = Vec::new();
     let (background_color, layout, font_size, content, font) = match render_primitive {
diff --git a/bevy_kayak_ui/src/render/unified/image/extract.rs b/bevy_kayak_ui/src/render/unified/image/extract.rs
index 44feb6c..04cfce8 100644
--- a/bevy_kayak_ui/src/render/unified/image/extract.rs
+++ b/bevy_kayak_ui/src/render/unified/image/extract.rs
@@ -9,6 +9,7 @@ use crate::{
 pub fn extract_images(
     render_command: &RenderPrimitive,
     image_manager: &Res<ImageManager>,
+    dpi: f32,
 ) -> Vec<ExtractQuadBundle> {
     let (layout, handle) = match render_command {
         RenderPrimitive::Image { layout, handle } => (layout, handle),
@@ -19,7 +20,7 @@ pub fn extract_images(
         extracted_quad: ExtractedQuad {
             rect: Rect {
                 min: Vec2::new(layout.posx, layout.posy),
-                max: Vec2::new(layout.posx + layout.width, layout.posy + layout.height),
+                max: Vec2::new(layout.posx + layout.width, layout.posy + layout.height) * dpi,
             },
             color: Color::WHITE,
             vertex_index: 0,
diff --git a/bevy_kayak_ui/src/render/unified/mod.rs b/bevy_kayak_ui/src/render/unified/mod.rs
index 1c8da6a..6fff2f9 100644
--- a/bevy_kayak_ui/src/render/unified/mod.rs
+++ b/bevy_kayak_ui/src/render/unified/mod.rs
@@ -7,6 +7,7 @@ use bevy::{
         RenderApp, RenderStage,
     },
     sprite::Rect,
+    window::Windows,
 };
 use kayak_core::{render_primitive::RenderPrimitive, Binding, Bound};
 use kayak_font::KayakFont;
@@ -68,6 +69,7 @@ pub fn extract(
     font_mapping: Res<FontMapping>,
     image_manager: Res<ImageManager>,
     images: Res<Assets<Image>>,
+    windows: Res<Windows>,
     window_size: Res<Binding<WindowSize>>,
 ) {
     let render_primitives = if let Ok(context) = context.kayak_context.read() {
@@ -76,26 +78,32 @@ pub fn extract(
         vec![]
     };
 
+    let dpi = if let Some(window) = windows.get_primary() {
+        window.scale_factor() as f32
+    } else {
+        1.0
+    };
+
     // dbg!(&render_primitives);
 
     let mut extracted_quads = Vec::new();
     for render_primitive in render_primitives {
         match render_primitive {
             RenderPrimitive::Text { .. } => {
-                let text_quads = font::extract_texts(&render_primitive, &fonts, &font_mapping);
+                let text_quads = font::extract_texts(&render_primitive, &fonts, &font_mapping, dpi);
                 extracted_quads.extend(text_quads);
             }
             RenderPrimitive::Image { .. } => {
-                let image_quads = image::extract_images(&render_primitive, &image_manager);
+                let image_quads = image::extract_images(&render_primitive, &image_manager, dpi);
                 extracted_quads.extend(image_quads);
             }
             RenderPrimitive::Quad { .. } => {
-                let quad_quads = quad::extract_quads(&render_primitive);
+                let quad_quads = quad::extract_quads(&render_primitive, dpi);
                 extracted_quads.extend(quad_quads);
             }
             RenderPrimitive::NinePatch { .. } => {
                 let nine_patch_quads =
-                    nine_patch::extract_nine_patch(&render_primitive, &image_manager, &images);
+                    nine_patch::extract_nine_patch(&render_primitive, &image_manager, &images, dpi);
                 extracted_quads.extend(nine_patch_quads);
             }
             RenderPrimitive::Clip { layout } => {
@@ -103,7 +111,8 @@ pub fn extract(
                     extracted_quad: ExtractedQuad {
                         rect: Rect {
                             min: Vec2::new(layout.posx, layout.posy),
-                            max: Vec2::new(layout.posx + layout.width, layout.posy + layout.height),
+                            max: Vec2::new(layout.posx + layout.width, layout.posy + layout.height)
+                                * dpi,
                         },
                         color: Color::default(),
                         vertex_index: 0,
diff --git a/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs b/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs
index 7d55910..7fd27af 100644
--- a/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs
+++ b/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs
@@ -15,6 +15,7 @@ pub fn extract_nine_patch(
     render_primitive: &RenderPrimitive,
     image_manager: &Res<ImageManager>,
     images: &Res<Assets<Image>>,
+    dpi: f32,
 ) -> Vec<ExtractQuadBundle> {
     let mut extracted_quads = Vec::new();
 
@@ -44,7 +45,8 @@ pub fn extract_nine_patch(
                 i.texture_descriptor.size.height as f32,
             ))
         })
-        .unwrap();
+        .unwrap()
+        * dpi;
 
     let extracted_quad_template = ExtractedQuad {
         rect: Rect {
diff --git a/bevy_kayak_ui/src/render/unified/quad/extract.rs b/bevy_kayak_ui/src/render/unified/quad/extract.rs
index d919d85..deb1acc 100644
--- a/bevy_kayak_ui/src/render/unified/quad/extract.rs
+++ b/bevy_kayak_ui/src/render/unified/quad/extract.rs
@@ -6,7 +6,7 @@ use crate::{
     to_bevy_color,
 };
 
-pub fn extract_quads(render_primitive: &RenderPrimitive) -> Vec<ExtractQuadBundle> {
+pub fn extract_quads(render_primitive: &RenderPrimitive, dpi: f32) -> Vec<ExtractQuadBundle> {
     let (background_color, layout, border_radius) = match render_primitive {
         RenderPrimitive::Quad {
             background_color,
@@ -20,7 +20,7 @@ pub fn extract_quads(render_primitive: &RenderPrimitive) -> Vec<ExtractQuadBundl
         extracted_quad: ExtractedQuad {
             rect: Rect {
                 min: Vec2::new(layout.posx, layout.posy),
-                max: Vec2::new(layout.posx + layout.width, layout.posy + layout.height),
+                max: Vec2::new(layout.posx + layout.width, layout.posy + layout.height) * dpi,
             },
             color: to_bevy_color(background_color),
             vertex_index: 0,
-- 
GitLab