From 02bdcbf6fffa38a822ecebcc84e16ad1be92c46e Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 22 Jul 2021 20:01:23 +0200 Subject: [PATCH] Janitor: Replace float comparison dance with approx_eq from euclid Sixtyfps uses euclid already, so let's use euclid for float comparisons as well. I changed the code to decide whether a number is a positive integer to make do without a comparison along the way. --- sixtyfps_compiler/passes/lower_layout.rs | 5 ++--- sixtyfps_runtime/rendering_backends/gl/lib.rs | 5 ++--- sixtyfps_runtime/rendering_backends/qt/qt_window.rs | 5 +++-- tools/figma_import/src/figmatypes.rs | 3 +-- tools/lsp/Cargo.toml | 1 + tools/lsp/main.rs | 3 ++- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sixtyfps_compiler/passes/lower_layout.rs b/sixtyfps_compiler/passes/lower_layout.rs index 6d5385468..92b944754 100644 --- a/sixtyfps_compiler/passes/lower_layout.rs +++ b/sixtyfps_compiler/passes/lower_layout.rs @@ -493,12 +493,11 @@ fn eval_const_expr( ) -> Option { match expression { Expression::NumberLiteral(v, Unit::None) => { - let r = *v as u16; - if (r as f32 - *v as f32).abs() > f32::EPSILON { + if *v < 0. || *v > u16::MAX as f64 || v.trunc() != *v { diag.push_error(format!("'{}' must be a positive integer", name), span); None } else { - Some(r) + Some(*v as u16) } } Expression::Cast { from, .. } => eval_const_expr(from, name, span, diag), diff --git a/sixtyfps_runtime/rendering_backends/gl/lib.rs b/sixtyfps_runtime/rendering_backends/gl/lib.rs index 2a6e57705..ca6347c6e 100644 --- a/sixtyfps_runtime/rendering_backends/gl/lib.rs +++ b/sixtyfps_runtime/rendering_backends/gl/lib.rs @@ -20,6 +20,7 @@ use std::cell::RefCell; use std::pin::Pin; use std::rc::Rc; +use euclid::approxeq::ApproxEq; use sixtyfps_corelib::graphics::{ Brush, Color, FontRequest, Image, IntRect, Point, Rect, RenderingCache, Size, }; @@ -457,9 +458,7 @@ fn rect_with_radius_to_path(rect: Rect, border_radius: f32) -> femtovg::Path { // If we're drawing a circle, use directly connected bezier curves instead of // ones with intermediate LineTo verbs, as `rounded_rect` creates, to avoid // rendering artifacts due to those edges. - if (width - height).abs() < 10.0 * f32::EPSILON - && (border_radius * 2. - width).abs() < 10.0 * f32::EPSILON - { + if width.approx_eq(&height) && (border_radius * 2.).approx_eq(&width) { path.circle(x + border_radius, y + border_radius, border_radius); } else { path.rounded_rect(x, y, width, height, border_radius); diff --git a/sixtyfps_runtime/rendering_backends/qt/qt_window.rs b/sixtyfps_runtime/rendering_backends/qt/qt_window.rs index 15ee442d0..efb6c8f48 100644 --- a/sixtyfps_runtime/rendering_backends/qt/qt_window.rs +++ b/sixtyfps_runtime/rendering_backends/qt/qt_window.rs @@ -9,6 +9,7 @@ LICENSE END */ use cpp::*; +use euclid::approxeq::ApproxEq; use items::{ImageFit, TextHorizontalAlignment, TextVerticalAlignment}; use sixtyfps_corelib::graphics::{Brush, FontRequest, Image, Point, Rect, RenderingCache, Size}; use sixtyfps_corelib::input::{InternalKeyCode, KeyEvent, KeyEventType, MouseEvent}; @@ -889,8 +890,8 @@ impl QtItemRenderer<'_> { rect.is_valid() && (rect.x != 0. || rect.y != 0. - || (rect.width - target_width).abs() > 100. * f64::EPSILON - || (rect.height - target_height).abs() > 100. * f64::EPSILON) + || rect.width.approx_eq(&target_width) + || rect.height.approx_eq(&target_height)) }); let source_size = if !has_source_clipping { Some(qttypes::QSize { width: target_width as u32, height: target_height as u32 }) diff --git a/tools/figma_import/src/figmatypes.rs b/tools/figma_import/src/figmatypes.rs index 025877fa2..be4736e3b 100644 --- a/tools/figma_import/src/figmatypes.rs +++ b/tools/figma_import/src/figmatypes.rs @@ -11,7 +11,6 @@ LICENSE END */ #![allow(unused)] use std::collections::HashMap; -use std::f32::EPSILON; use derive_more::*; use serde::Deserialize; @@ -77,7 +76,7 @@ pub struct Color { impl Color { pub fn is_transparent(&self) -> bool { - self.a <= f32::EPSILON + self.a.approx_eq(&0.) } } diff --git a/tools/lsp/Cargo.toml b/tools/lsp/Cargo.toml index 85ca83f0a..cc52e125d 100644 --- a/tools/lsp/Cargo.toml +++ b/tools/lsp/Cargo.toml @@ -24,6 +24,7 @@ sixtyfps-rendering-backend-default = { version = "=0.1.0", path="../../sixtyfps_ lsp-types = "0.89" lsp-server = "0.5" crossbeam-channel = "0.5" # must match the version used by lsp-server +euclid = "0.22" serde_json = "1.0.60" serde = "1.0.118" spin_on = "0.1" diff --git a/tools/lsp/main.rs b/tools/lsp/main.rs index ab613de81..558e33993 100644 --- a/tools/lsp/main.rs +++ b/tools/lsp/main.rs @@ -14,6 +14,7 @@ mod lsp_ext; mod preview; mod util; +use euclid::approxeq::ApproxEq; use std::collections::HashMap; use structopt::StructOpt; @@ -271,7 +272,7 @@ fn handle_request( // representation. let requested_color = params.color; - let color_literal = if (requested_color.alpha - 1.).abs() > 10.0 * f32::EPSILON { + let color_literal = if requested_color.alpha.approx_eq(&1.) { format!( "#{:0>2x}{:0>2x}{:0>2x}{:0>2x}", (requested_color.red * 255.) as u8,