OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2008 The Android Open Source Project | 3 * Copyright 2008 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkMathPriv.h" | 10 #include "SkMathPriv.h" |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 float *lengthSquared) { | 93 float *lengthSquared) { |
94 *lengthSquared = getLengthSquared(dx, dy); | 94 *lengthSquared = getLengthSquared(dx, dy); |
95 return *lengthSquared <= (SK_ScalarNearlyZero * SK_ScalarNearlyZero); | 95 return *lengthSquared <= (SK_ScalarNearlyZero * SK_ScalarNearlyZero); |
96 } | 96 } |
97 | 97 |
98 SkScalar SkPoint::Normalize(SkPoint* pt) { | 98 SkScalar SkPoint::Normalize(SkPoint* pt) { |
99 float x = pt->fX; | 99 float x = pt->fX; |
100 float y = pt->fY; | 100 float y = pt->fY; |
101 float mag2; | 101 float mag2; |
102 if (isLengthNearlyZero(x, y, &mag2)) { | 102 if (isLengthNearlyZero(x, y, &mag2)) { |
| 103 pt->set(0, 0); |
103 return 0; | 104 return 0; |
104 } | 105 } |
105 | 106 |
106 float mag, scale; | 107 float mag, scale; |
107 if (SkScalarIsFinite(mag2)) { | 108 if (SkScalarIsFinite(mag2)) { |
108 mag = sk_float_sqrt(mag2); | 109 mag = sk_float_sqrt(mag2); |
109 scale = 1 / mag; | 110 scale = 1 / mag; |
110 } else { | 111 } else { |
111 // our mag2 step overflowed to infinity, so use doubles instead. | 112 // our mag2 step overflowed to infinity, so use doubles instead. |
112 // much slower, but needed when x or y are very large, other wise we | 113 // much slower, but needed when x or y are very large, other wise we |
(...skipping 27 matching lines...) Expand all Loading... |
140 * We have to worry about 2 tricky conditions: | 141 * We have to worry about 2 tricky conditions: |
141 * 1. underflow of mag2 (compared against nearlyzero^2) | 142 * 1. underflow of mag2 (compared against nearlyzero^2) |
142 * 2. overflow of mag2 (compared w/ isfinite) | 143 * 2. overflow of mag2 (compared w/ isfinite) |
143 * | 144 * |
144 * If we underflow, we return false. If we overflow, we compute again using | 145 * If we underflow, we return false. If we overflow, we compute again using |
145 * doubles, which is much slower (3x in a desktop test) but will not overflow. | 146 * doubles, which is much slower (3x in a desktop test) but will not overflow. |
146 */ | 147 */ |
147 bool SkPoint::setLength(float x, float y, float length) { | 148 bool SkPoint::setLength(float x, float y, float length) { |
148 float mag2; | 149 float mag2; |
149 if (isLengthNearlyZero(x, y, &mag2)) { | 150 if (isLengthNearlyZero(x, y, &mag2)) { |
| 151 this->set(0, 0); |
150 return false; | 152 return false; |
151 } | 153 } |
152 | 154 |
153 float scale; | 155 float scale; |
154 if (SkScalarIsFinite(mag2)) { | 156 if (SkScalarIsFinite(mag2)) { |
155 scale = length / sk_float_sqrt(mag2); | 157 scale = length / sk_float_sqrt(mag2); |
156 } else { | 158 } else { |
157 // our mag2 step overflowed to infinity, so use doubles instead. | 159 // our mag2 step overflowed to infinity, so use doubles instead. |
158 // much slower, but needed when x or y are very large, other wise we | 160 // much slower, but needed when x or y are very large, other wise we |
159 // divide by inf. and return (0,0) vector. | 161 // divide by inf. and return (0,0) vector. |
(...skipping 16 matching lines...) Expand all Loading... |
176 return true; | 178 return true; |
177 } | 179 } |
178 | 180 |
179 bool SkPoint::setLengthFast(float length) { | 181 bool SkPoint::setLengthFast(float length) { |
180 return this->setLengthFast(fX, fY, length); | 182 return this->setLengthFast(fX, fY, length); |
181 } | 183 } |
182 | 184 |
183 bool SkPoint::setLengthFast(float x, float y, float length) { | 185 bool SkPoint::setLengthFast(float x, float y, float length) { |
184 float mag2; | 186 float mag2; |
185 if (isLengthNearlyZero(x, y, &mag2)) { | 187 if (isLengthNearlyZero(x, y, &mag2)) { |
| 188 this->set(0, 0); |
186 return false; | 189 return false; |
187 } | 190 } |
188 | 191 |
189 float scale; | 192 float scale; |
190 if (SkScalarIsFinite(mag2)) { | 193 if (SkScalarIsFinite(mag2)) { |
191 scale = length * sk_float_rsqrt(mag2); // <--- this is the difference | 194 scale = length * sk_float_rsqrt(mag2); // <--- this is the difference |
192 } else { | 195 } else { |
193 // our mag2 step overflowed to infinity, so use doubles instead. | 196 // our mag2 step overflowed to infinity, so use doubles instead. |
194 // much slower, but needed when x or y are very large, other wise we | 197 // much slower, but needed when x or y are very large, other wise we |
195 // divide by inf. and return (0,0) vector. | 198 // divide by inf. and return (0,0) vector. |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 | 252 |
250 if (uDotV <= 0) { | 253 if (uDotV <= 0) { |
251 return v.lengthSqd(); | 254 return v.lengthSqd(); |
252 } else if (uDotV > uLengthSqd) { | 255 } else if (uDotV > uLengthSqd) { |
253 return b.distanceToSqd(*this); | 256 return b.distanceToSqd(*this); |
254 } else { | 257 } else { |
255 SkScalar det = u.cross(v); | 258 SkScalar det = u.cross(v); |
256 return SkScalarMulDiv(det, det, uLengthSqd); | 259 return SkScalarMulDiv(det, det, uLengthSqd); |
257 } | 260 } |
258 } | 261 } |
OLD | NEW |