Bladeren bron

app: bugfix scaling errors. when downscaling, we increase the virtual screen size, but if the initial view didn't have scale applied, then clipping when restrict the downscaled size incorrectly.

darkfi 1 jaar geleden
bovenliggende
commit
e943d9c4ff
3 gewijzigde bestanden met toevoegingen van 10 en 6 verwijderingen
  1. 3 3
      bin/app/src/app/mod.rs
  2. 5 1
      bin/app/src/gfx/mod.rs
  3. 2 2
      bin/app/src/ui/win.rs

+ 3 - 3
bin/app/src/app/mod.rs

@@ -113,12 +113,12 @@ impl App {
         let mut window_scale = 1.;
         #[cfg(target_os = "android")]
         {
-            //window_scale = android::get_screen_density() / 2.625;
-            //d!("Setting window_scale to {window_scale}");
+            window_scale = android::get_screen_density() / 2.625;
+            d!("Setting window_scale to {window_scale}");
         }
 
         settings.add_setting("scale", PropertyValue::Float32(window_scale));
-        settings.load_settings();
+        //settings.load_settings();
 
         // Save app settings in sled when they change
         for setting_node in settings.setting_root.get_children().iter() {

+ 5 - 1
bin/app/src/gfx/mod.rs

@@ -420,8 +420,8 @@ impl<'a> RenderContext<'a> {
     }
 
     fn apply_view(&mut self) {
+        // Actual physical view
         let view = self.view * self.scale;
-
         let (_, screen_height) = window::screen_size();
 
         let view_x = view.x.round() as i32;
@@ -468,6 +468,8 @@ impl<'a> RenderContext<'a> {
             match instr {
                 DrawInstruction::SetScale(scale) => {
                     self.scale = *scale;
+                    self.view.w /= self.scale;
+                    self.view.h /= self.scale;
                     if is_debug {
                         debug!(target: "gfx", "{ws}set_scale({scale})");
                     }
@@ -495,12 +497,14 @@ impl<'a> RenderContext<'a> {
                 DrawInstruction::ApplyView(view) => {
                     // Adjust view relative to cursor
                     self.view = *view + self.cursor;
+
                     // We could just skip drawing when clipping rect isn't visible
                     // using an is_visible flag.
                     match self.view.clip(&old_view) {
                         Some(clipped) => self.view = clipped,
                         None => self.view = Rectangle::zero(),
                     }
+
                     // Cursor resets within the view
                     self.cursor = Point::zero();
                     if is_debug {

+ 2 - 2
bin/app/src/ui/win.rs

@@ -430,8 +430,8 @@ impl Window {
         let trace_id = rand::random();
         let timest = unixtime();
 
-        let local = self.screen_size.get() / self.scale.get();
-        let rect = Rectangle::from([0., 0., local.w, local.h]);
+        let virt_size = self.screen_size.get() / self.scale.get();
+        let rect = Rectangle::from([0., 0., virt_size.w, virt_size.h]);
         t!("Window::draw({rect:?}) [timest={timest}, trace_id={trace_id}]");
 
         let mut draw_calls = vec![];