From 90dda8219f099a6c355ddca3073a7798ae868593 Mon Sep 17 00:00:00 2001 From: Ali Date: Tue, 3 Jun 2025 14:06:05 +0300 Subject: [PATCH] Fixed: radians rewritten to degrees without converting (#19848) --- src/css/css_parser.zig | 16 ++++++++++++++++ src/css/values/angle.zig | 6 +++--- test/js/bun/css/css.test.ts | 8 ++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/css/css_parser.zig b/src/css/css_parser.zig index b42ffc140b..9a1c723b75 100644 --- a/src/css/css_parser.zig +++ b/src/css/css_parser.zig @@ -7322,3 +7322,19 @@ fn restrict_prec(buf: []u8, comptime prec: u8) struct { []u8, Notation } { pub inline fn fract(val: f32) f32 { return val - @trunc(val); } + +pub fn f32_length_with_5_digits(n_input: f32) usize { + var n = std.math.round(n_input * 100000.0); + var count: usize = 0; + var i: usize = 0; + + while (n >= 1.0) : (i += 1) { + const rem = @mod(n, 10.0); + if (i > 4 or rem != 0.0) { + count += 1; + } + n = n / 10.0; + } + + return count; +} diff --git a/src/css/values/angle.zig b/src/css/values/angle.zig index 40a12b4f0e..0ad2648d0b 100644 --- a/src/css/values/angle.zig +++ b/src/css/values/angle.zig @@ -85,9 +85,9 @@ pub const Angle = union(Tag) { const deg = this.toDegrees(); // We print 5 digits of precision by default. - // Switch to degrees if there are an even number of them. - if (css.fract(std.math.round(deg * 100000.0)) == 0) { - break :brk .{ val, "deg" }; + // Switch to degrees if length is smaller than rad. + if (css.f32_length_with_5_digits(deg) < css.f32_length_with_5_digits(val)) { + break :brk .{ deg, "deg" }; } else { break :brk .{ val, "rad" }; } diff --git a/test/js/bun/css/css.test.ts b/test/js/bun/css/css.test.ts index 43a22fd731..54745a05f9 100644 --- a/test/js/bun/css/css.test.ts +++ b/test/js/bun/css/css.test.ts @@ -6939,6 +6939,14 @@ describe("css tests", () => { minify_test(".foo { transform: scale3d(1, 2, 1)", ".foo{transform:scaleY(2)}"); minify_test(".foo { transform: scale3d(1, 1, 2)", ".foo{transform:scaleZ(2)}"); minify_test(".foo { transform: scale3d(2, 2, 1)", ".foo{transform:scale(2)}"); + minify_test(".foo { transform: rotate(20rad)", ".foo{transform:rotate(20rad)}"); + minify_test(".foo { transform: rotateX(20rad)", ".foo{transform:rotateX(20rad)}"); + minify_test(".foo { transform: rotateY(20rad)", ".foo{transform:rotateY(20rad)}"); + minify_test(".foo { transform: rotateZ(20rad)", ".foo{transform:rotate(20rad)}"); + minify_test(".foo { transform: rotateX(0.017453293rad)", ".foo{transform:rotateX(1deg)}"); + minify_test(".foo { transform: rotateY(0.017453293rad)", ".foo{transform:rotateY(1deg)}"); + minify_test(".foo { transform: rotateZ(0.017453293rad)", ".foo{transform:rotate(1deg)}"); + minify_test(".foo { transform: rotate(0.017453293rad)", ".foo{transform:rotate(1deg)}"); minify_test(".foo { transform: rotate(20deg)", ".foo{transform:rotate(20deg)}"); minify_test(".foo { transform: rotateX(20deg)", ".foo{transform:rotateX(20deg)}"); minify_test(".foo { transform: rotateY(20deg)", ".foo{transform:rotateY(20deg)}");