OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2012 Google Inc. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license that can be | |
5 * found in the LICENSE file. | |
6 */ | |
7 #include "DataTypes.h" | |
8 | |
9 #include <sys/types.h> | |
10 #include <stdlib.h> | |
11 | |
12 #if USE_EPSILON | |
13 const double PointEpsilon = 0.000001; | |
14 const double SquaredEpsilon = PointEpsilon * PointEpsilon; | |
15 #endif | |
16 | |
17 const int UlpsEpsilon = 16; | |
18 | |
19 _Vector operator-(const _Point& a, const _Point& b) { | |
20 _Vector v = {a.x - b.x, a.y - b.y}; | |
21 return v; | |
22 } | |
23 | |
24 _Point operator+(const _Point& a, const _Vector& b) { | |
25 _Point v = {a.x + b.x, a.y + b.y}; | |
26 return v; | |
27 } | |
28 | |
29 // from http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-num
bers-2012-edition/ | |
30 union Float_t | |
31 { | |
32 Float_t(float num = 0.0f) : f(num) {} | |
33 // Portable extraction of components. | |
34 bool negative() const { return (i >> 31) != 0; } | |
35 #if 0 // unused | |
36 int32_t RawMantissa() const { return i & ((1 << 23) - 1); } | |
37 int32_t RawExponent() const { return (i >> 23) & 0xFF; } | |
38 #endif | |
39 int32_t i; | |
40 float f; | |
41 #ifdef SK_DEBUG | |
42 struct | |
43 { // Bitfields for exploration. Do not use in production code. | |
44 uint32_t mantissa : 23; | |
45 uint32_t exponent : 8; | |
46 uint32_t sign : 1; | |
47 } parts; | |
48 #endif | |
49 }; | |
50 | |
51 bool AlmostEqualUlps(float A, float B) | |
52 { | |
53 Float_t uA(A); | |
54 Float_t uB(B); | |
55 | |
56 // Different signs means they do not match. | |
57 if (uA.negative() != uB.negative()) | |
58 { | |
59 // Check for equality to make sure +0==-0 | |
60 return A == B; | |
61 } | |
62 | |
63 // Find the difference in ULPs. | |
64 int ulpsDiff = abs(uA.i - uB.i); | |
65 return ulpsDiff <= UlpsEpsilon; | |
66 } | |
67 | |
68 // FIXME: obsolete, delete | |
69 #if 1 | |
70 int UlpsDiff(float A, float B) | |
71 { | |
72 Float_t uA(A); | |
73 Float_t uB(B); | |
74 | |
75 return abs(uA.i - uB.i); | |
76 } | |
77 #endif | |
78 | |
79 #ifdef SK_DEBUG | |
80 void mathematica_ize(char* str, size_t bufferLen) { | |
81 size_t len = strlen(str); | |
82 bool num = false; | |
83 for (size_t idx = 0; idx < len; ++idx) { | |
84 if (num && str[idx] == 'e') { | |
85 if (len + 2 >= bufferLen) { | |
86 return; | |
87 } | |
88 memmove(&str[idx + 2], &str[idx + 1], len - idx); | |
89 str[idx] = '*'; | |
90 str[idx + 1] = '^'; | |
91 ++len; | |
92 } | |
93 num = str[idx] >= '0' && str[idx] <= '9'; | |
94 } | |
95 } | |
96 | |
97 bool valid_wind(int wind) { | |
98 return wind > SK_MinS32 + 0xFFFF && wind < SK_MaxS32 - 0xFFFF; | |
99 } | |
100 | |
101 void winding_printf(int wind) { | |
102 if (wind == SK_MinS32) { | |
103 SkDebugf("?"); | |
104 } else { | |
105 SkDebugf("%d", wind); | |
106 } | |
107 } | |
108 #endif | |
OLD | NEW |