diff --git a/src/render/mod.rs b/src/render/mod.rs index a25b167..665721a 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -336,10 +336,12 @@ impl Canvas /// [`Self::viewport_logical`], with this canvas' [`Self::density`], /// times the global accessibility [`crate::text_scale`]. Counterpart /// of [`Self::resolve_geom`] for font sizes, which are handed to the - /// raster path pre-`dpi_scale`. + /// raster path pre-`dpi_scale`, so `Dp` uses `density / dpi_scale`. pub fn resolve_font( &self, l: Length ) -> f32 { - l.resolve_with_density( self.viewport_logical(), Length::EM_BASE_DEFAULT, self.density() ) + let scale = self.dpi_scale(); + let scale = if scale > 0.0 { scale } else { 1.0 }; + l.resolve_with_density( self.viewport_logical(), Length::EM_BASE_DEFAULT, self.density() / scale ) * crate::types::text_scale() } @@ -375,9 +377,7 @@ impl Canvas } WidgetScaling::Physical => { - let scale = self.dpi_scale(); - let scale = if scale > 0.0 { scale } else { 1.0 }; - design_px * self.density() / scale * crate::types::text_scale() + self.resolve_font( Length::dp( design_px ) ) } } } @@ -1148,6 +1148,24 @@ mod viewport_tests set_density( 1.0 ); set_widget_scaling( WidgetScaling::Fluid ); } + + #[ test ] + fn dp_font_matches_dp_geometry_on_hidpi() + { + use crate::types::{ set_widget_scaling, set_density, WidgetScaling }; + let _g = crate::TEST_GLOBALS_LOCK.lock().unwrap_or_else( |e| e.into_inner() ); + + set_widget_scaling( WidgetScaling::Physical ); + set_density( 3.0 ); + let mut c = Canvas::new( 2560, 1440 ); + c.set_dpi_scale( 3.0 ); + assert_eq!( c.resolve_font( Length::dp( 20.0 ) ), 20.0 ); + assert_eq!( c.resolve_font( Length::widget( 20.0 ) ), c.font_px( 20.0 ) ); + assert_eq!( c.resolve_font( Length::dp( 20.0 ) ) * 3.0, c.resolve_geom( Length::dp( 20.0 ) ) ); + + set_density( 1.0 ); + set_widget_scaling( WidgetScaling::Fluid ); + } } #[ cfg( test ) ]