Browse Source

LibWeb: Saturate PixelUnits on creation when needed

Hendiadyoin1 1 năm trước cách đây
mục cha
commit
1e5ba09d76

+ 14 - 3
Userland/Libraries/LibWeb/PixelUnits.cpp

@@ -11,17 +11,28 @@ namespace Web {
 
 CSSPixels::CSSPixels(int value)
 {
-    m_value = value * fixed_point_denominator;
+    if (value > max_integer_value) [[unlikely]]
+        m_value = NumericLimits<int>::max();
+    else if (value < min_integer_value) [[unlikely]]
+        m_value = NumericLimits<int>::min();
+    else
+        m_value = value << fractional_bits;
 }
 
 CSSPixels::CSSPixels(unsigned int value)
 {
-    m_value = value * fixed_point_denominator;
+    if (value > max_integer_value) [[unlikely]]
+        m_value = NumericLimits<int>::max();
+    else
+        m_value = static_cast<int>(value) << fractional_bits;
 }
 
 CSSPixels::CSSPixels(unsigned long value)
 {
-    m_value = value * fixed_point_denominator;
+    if (value > max_integer_value) [[unlikely]]
+        m_value = NumericLimits<int>::max();
+    else
+        m_value = static_cast<int>(value) << fractional_bits;
 }
 
 CSSPixels::CSSPixels(float value)

+ 3 - 0
Userland/Libraries/LibWeb/PixelUnits.h

@@ -57,6 +57,9 @@ public:
 
     static constexpr i32 radix_mask = fixed_point_denominator - 1;
 
+    static constexpr i32 max_integer_value = NumericLimits<int>::max() >> fractional_bits;
+    static constexpr i32 min_integer_value = NumericLimits<int>::min() >> fractional_bits;
+
     CSSPixels() = default;
     CSSPixels(int value);
     CSSPixels(unsigned int value);