OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 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 #ifndef SkGeometry_DEFINED | 10 #ifndef SkGeometry_DEFINED |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 | 219 |
220 /** Given 2 unit vectors and a rotation direction, fill out the specified | 220 /** Given 2 unit vectors and a rotation direction, fill out the specified |
221 array of points with quadratic segments. Return is the number of points | 221 array of points with quadratic segments. Return is the number of points |
222 written to, which will be { 0, 3, 5, 7, ... kSkBuildQuadArcStorage } | 222 written to, which will be { 0, 3, 5, 7, ... kSkBuildQuadArcStorage } |
223 | 223 |
224 matrix, if not null, is appled to the points before they are returned. | 224 matrix, if not null, is appled to the points before they are returned. |
225 */ | 225 */ |
226 int SkBuildQuadArc(const SkVector& unitStart, const SkVector& unitStop, | 226 int SkBuildQuadArc(const SkVector& unitStart, const SkVector& unitStop, |
227 SkRotationDirection, const SkMatrix*, SkPoint quadPoints[]); | 227 SkRotationDirection, const SkMatrix*, SkPoint quadPoints[]); |
228 | 228 |
229 // experimental | |
230 struct SkConic { | 229 struct SkConic { |
231 SkConic() {} | 230 SkConic() {} |
232 SkConic(const SkPoint& p0, const SkPoint& p1, const SkPoint& p2, SkScalar w)
{ | 231 SkConic(const SkPoint& p0, const SkPoint& p1, const SkPoint& p2, SkScalar w)
{ |
233 fPts[0] = p0; | 232 fPts[0] = p0; |
234 fPts[1] = p1; | 233 fPts[1] = p1; |
235 fPts[2] = p2; | 234 fPts[2] = p2; |
236 fW = w; | 235 fW = w; |
237 } | 236 } |
238 SkConic(const SkPoint pts[3], SkScalar w) { | 237 SkConic(const SkPoint pts[3], SkScalar w) { |
239 memcpy(fPts, pts, sizeof(fPts)); | 238 memcpy(fPts, pts, sizeof(fPts)); |
240 fW = w; | 239 fW = w; |
241 } | 240 } |
242 | 241 |
243 SkPoint fPts[3]; | 242 SkPoint fPts[3]; |
244 SkScalar fW; | 243 SkScalar fW; |
245 | 244 |
246 void set(const SkPoint pts[3], SkScalar w) { | 245 void set(const SkPoint pts[3], SkScalar w) { |
247 memcpy(fPts, pts, 3 * sizeof(SkPoint)); | 246 memcpy(fPts, pts, 3 * sizeof(SkPoint)); |
248 fW = w; | 247 fW = w; |
249 } | 248 } |
250 | 249 |
| 250 void set(const SkPoint& p0, const SkPoint& p1, const SkPoint& p2, SkScalar w
) { |
| 251 fPts[0] = p0; |
| 252 fPts[1] = p1; |
| 253 fPts[2] = p2; |
| 254 fW = w; |
| 255 } |
| 256 |
251 /** | 257 /** |
252 * Given a t-value [0...1] return its position and/or tangent. | 258 * Given a t-value [0...1] return its position and/or tangent. |
253 * If pos is not null, return its position at the t-value. | 259 * If pos is not null, return its position at the t-value. |
254 * If tangent is not null, return its tangent at the t-value. NOTE the | 260 * If tangent is not null, return its tangent at the t-value. NOTE the |
255 * tangent value's length is arbitrary, and only its direction should | 261 * tangent value's length is arbitrary, and only its direction should |
256 * be used. | 262 * be used. |
257 */ | 263 */ |
258 void evalAt(SkScalar t, SkPoint* pos, SkVector* tangent = NULL) const; | 264 void evalAt(SkScalar t, SkPoint* pos, SkVector* tangent = NULL) const; |
259 void chopAt(SkScalar t, SkConic dst[2]) const; | 265 void chopAt(SkScalar t, SkConic dst[2]) const; |
260 void chop(SkConic dst[2]) const; | 266 void chop(SkConic dst[2]) const; |
(...skipping 24 matching lines...) Expand all Loading... |
285 /** Find the parameter value where the conic takes on its maximum curvature. | 291 /** Find the parameter value where the conic takes on its maximum curvature. |
286 * | 292 * |
287 * @param t output scalar for max curvature. Will be unchanged if | 293 * @param t output scalar for max curvature. Will be unchanged if |
288 * max curvature outside 0..1 range. | 294 * max curvature outside 0..1 range. |
289 * | 295 * |
290 * @return true if max curvature found inside 0..1 range, false otherwise | 296 * @return true if max curvature found inside 0..1 range, false otherwise |
291 */ | 297 */ |
292 bool findMaxCurvature(SkScalar* t) const; | 298 bool findMaxCurvature(SkScalar* t) const; |
293 | 299 |
294 static SkScalar TransformW(const SkPoint[3], SkScalar w, const SkMatrix&); | 300 static SkScalar TransformW(const SkPoint[3], SkScalar w, const SkMatrix&); |
| 301 |
| 302 enum { |
| 303 kMaxConicsForArc = 5 |
| 304 }; |
| 305 static int BuildUnitArc(const SkVector& start, const SkVector& stop, SkRotat
ionDirection, |
| 306 const SkMatrix*, SkConic conics[kMaxConicsForArc]); |
295 }; | 307 }; |
296 | 308 |
297 #include "SkTemplates.h" | 309 #include "SkTemplates.h" |
298 | 310 |
299 /** | 311 /** |
300 * Help class to allocate storage for approximating a conic with N quads. | 312 * Help class to allocate storage for approximating a conic with N quads. |
301 */ | 313 */ |
302 class SkAutoConicToQuads { | 314 class SkAutoConicToQuads { |
303 public: | 315 public: |
304 SkAutoConicToQuads() : fQuadCount(0) {} | 316 SkAutoConicToQuads() : fQuadCount(0) {} |
(...skipping 30 matching lines...) Expand all Loading... |
335 private: | 347 private: |
336 enum { | 348 enum { |
337 kQuadCount = 8, // should handle most conics | 349 kQuadCount = 8, // should handle most conics |
338 kPointCount = 1 + 2 * kQuadCount, | 350 kPointCount = 1 + 2 * kQuadCount, |
339 }; | 351 }; |
340 SkAutoSTMalloc<kPointCount, SkPoint> fStorage; | 352 SkAutoSTMalloc<kPointCount, SkPoint> fStorage; |
341 int fQuadCount; // #quads for current usage | 353 int fQuadCount; // #quads for current usage |
342 }; | 354 }; |
343 | 355 |
344 #endif | 356 #endif |
OLD | NEW |