Number to use double for all types
diff --git a/src/hb-cff-interp-common.hh b/src/hb-cff-interp-common.hh
index aa2a1b9..2ec056f 100644
--- a/src/hb-cff-interp-common.hh
+++ b/src/hb-cff-interp-common.hh
@@ -218,80 +218,41 @@
struct Number
{
inline void init (void)
- { set_int (0); }
+ { set_real (0.0); }
inline void fini (void)
{}
- inline void set_int (int v) { format = NumInt; u.int_val = v; }
- inline int to_int (void) const { return is_int ()? u.int_val: (int)to_real (); }
- inline void set_fixed (int32_t v) { format = NumFixed; u.fixed_val = v; }
+ inline void set_int (int v) { value = (double)v; }
+ inline int to_int (void) const { return (int)value; }
+ inline void set_fixed (int32_t v) { value = v / 65536.0; }
inline int32_t to_fixed (void) const
{
- if (is_fixed ())
- return u.fixed_val;
- else if (is_real ())
- return (int32_t)(u.real_val * 65536.0f);
- else
- return (int32_t)(u.int_val << 16);
+ return (int32_t)(value * 65536.0);
}
- inline void set_real (float v) { format = NumReal; u.real_val = v; }
+ inline void set_real (float v) { value = (double)v; }
inline float to_real (void) const
{
- if (is_real ())
- return u.real_val;
- if (is_fixed ())
- return u.fixed_val / 65536.0f;
- else
- return (float)u.int_val;
+ return (float)value;
}
inline int ceil (void) const
{
- switch (format)
- {
- default:
- case NumInt:
- return u.int_val;
- case NumFixed:
- return (u.fixed_val + 0xFFFF) >> 16;
- case NumReal:
- return (int)ceilf (u.real_val);
- }
+ return (int)::ceil (value);
}
inline int floor (void) const
{
- switch (format)
- {
- default:
- case NumInt:
- return u.int_val;
- case NumFixed:
- return u.fixed_val >> 16;
- case NumReal:
- return (int)floorf (u.real_val);
- }
+ return (int)::floor (value);
}
inline bool in_int_range (void) const
{
- if (is_int ())
- return true;
- if (is_fixed () && ((u.fixed_val & 0xFFFF) == 0))
- return true;
- else
- return ((float)(int16_t)to_int () == u.real_val);
+ return ((double)(int16_t)to_int () == value);
}
inline bool operator > (const Number &n) const
{
- switch (format)
- {
- default:
- case NumInt: return u.int_val > n.to_int ();
- case NumFixed: return u.fixed_val > n.to_fixed ();
- case NumReal: return u.real_val > n.to_real ();
- }
+ return value > n.to_real ();
}
inline bool operator < (const Number &n) const
@@ -305,32 +266,13 @@
inline const Number &operator += (const Number &n)
{
- if (format == NumReal || n.format == NumReal)
- set_real (to_real () + n.to_real ());
- else if (format == NumFixed || n.format == NumFixed)
- set_fixed (to_fixed () + n.to_fixed ());
- else
- set_int (to_int () + n.to_int ());
+ set_real (to_real () + n.to_real ());
return *this;
}
protected:
- enum NumFormat {
- NumInt,
- NumFixed,
- NumReal
- };
- NumFormat format;
- union {
- int int_val;
- int32_t fixed_val;
- float real_val;
- } u;
-
- inline bool is_int (void) const { return format == NumInt; }
- inline bool is_fixed (void) const { return format == NumFixed; }
- inline bool is_real (void) const { return format == NumReal; }
+ double value;
};
/* byte string */