Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(247)

Side by Side Diff: src/core/SkGeometry.cpp

Issue 18258005: Add implicit hairline conic rendering to GPU (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 #include "SkGeometry.h" 10 #include "SkGeometry.h"
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 // if we get here, we need to force dst to be monotonic, even though 375 // if we get here, we need to force dst to be monotonic, even though
376 // we couldn't compute a unit_divide value (probably underflow). 376 // we couldn't compute a unit_divide value (probably underflow).
377 b = SkScalarAbs(a - b) < SkScalarAbs(b - c) ? a : c; 377 b = SkScalarAbs(a - b) < SkScalarAbs(b - c) ? a : c;
378 } 378 }
379 dst[0].set(a, src[0].fY); 379 dst[0].set(a, src[0].fY);
380 dst[1].set(b, src[1].fY); 380 dst[1].set(b, src[1].fY);
381 dst[2].set(c, src[2].fY); 381 dst[2].set(c, src[2].fY);
382 return 0; 382 return 0;
383 } 383 }
384 384
385 // F(t) = a (1 - t) ^ 2 + 2 b t (1 - t) + c t ^ 2 385 float SkGetTQuadAtMaxCurvature(const SkPoint src[3]) {
386 // F'(t) = 2 (b - a) + 2 (a - 2b + c) t 386
387 // F''(t) = 2 (a - 2b + c)
388 //
389 // A = 2 (b - a)
390 // B = 2 (a - 2b + c)
391 //
392 // Maximum curvature for a quadratic means solving
393 // Fx' Fx'' + Fy' Fy'' = 0
394 //
395 // t = - (Ax Bx + Ay By) / (Bx ^ 2 + By ^ 2)
396 //
397 int SkChopQuadAtMaxCurvature(const SkPoint src[3], SkPoint dst[5])
398 {
399 SkScalar Ax = src[1].fX - src[0].fX; 387 SkScalar Ax = src[1].fX - src[0].fX;
400 SkScalar Ay = src[1].fY - src[0].fY; 388 SkScalar Ay = src[1].fY - src[0].fY;
401 SkScalar Bx = src[0].fX - src[1].fX - src[1].fX + src[2].fX; 389 SkScalar Bx = src[0].fX - src[1].fX - src[1].fX + src[2].fX;
402 SkScalar By = src[0].fY - src[1].fY - src[1].fY + src[2].fY; 390 SkScalar By = src[0].fY - src[1].fY - src[1].fY + src[2].fY;
403 SkScalar t = 0; // 0 means don't chop 391 SkScalar t = 0; // 0 means don't chop
404 392
405 #ifdef SK_SCALAR_IS_FLOAT 393 #ifdef SK_SCALAR_IS_FLOAT
406 (void)valid_unit_divide(-(Ax * Bx + Ay * By), Bx * Bx + By * By, &t); 394 (void)valid_unit_divide(-(Ax * Bx + Ay * By), Bx * Bx + By * By, &t);
407 #else 395 #else
408 // !!! should I use SkFloat here? seems like it 396 // !!! should I use SkFloat here? seems like it
(...skipping 11 matching lines...) Expand all
420 SkASSERT(!denom.isNeg()); 408 SkASSERT(!denom.isNeg());
421 if (numer < denom) 409 if (numer < denom)
422 { 410 {
423 t = numer.getFixedDiv(denom); 411 t = numer.getFixedDiv(denom);
424 SkASSERT(t >= 0 && t <= SK_Fixed1); // assert that we're numeric ally stable (ha!) 412 SkASSERT(t >= 0 && t <= SK_Fixed1); // assert that we're numeric ally stable (ha!)
425 if ((unsigned)t >= SK_Fixed1) // runtime check for numeric al stability 413 if ((unsigned)t >= SK_Fixed1) // runtime check for numeric al stability
426 t = 0; // ignore the chop 414 t = 0; // ignore the chop
427 } 415 }
428 } 416 }
429 #endif 417 #endif
418 return t;
419 }
430 420
421 // F(t) = a (1 - t) ^ 2 + 2 b t (1 - t) + c t ^ 2
bsalomon 2013/07/10 15:14:36 Maybe these comments belong with the new function
422 // F'(t) = 2 (b - a) + 2 (a - 2b + c) t
423 // F''(t) = 2 (a - 2b + c)
424 //
425 // A = 2 (b - a)
426 // B = 2 (a - 2b + c)
427 //
428 // Maximum curvature for a quadratic means solving
429 // Fx' Fx'' + Fy' Fy'' = 0
430 //
431 // t = - (Ax Bx + Ay By) / (Bx ^ 2 + By ^ 2)
432 //
433 int SkChopQuadAtMaxCurvature(const SkPoint src[3], SkPoint dst[5])
434 {
435 SkScalar t = SkGetTQuadAtMaxCurvature(src);
431 if (t == 0) 436 if (t == 0)
432 { 437 {
433 memcpy(dst, src, 3 * sizeof(SkPoint)); 438 memcpy(dst, src, 3 * sizeof(SkPoint));
434 return 1; 439 return 1;
435 } 440 }
436 else 441 else
437 { 442 {
438 SkChopQuadAt(src, dst, t); 443 SkChopQuadAt(src, dst, t);
439 return 2; 444 return 2;
440 } 445 }
(...skipping 1217 matching lines...) Expand 10 before | Expand all | Expand 10 after
1658 } 1663 }
1659 if (this->findYExtrema(&t)) { 1664 if (this->findYExtrema(&t)) {
1660 this->evalAt(t, &pts[count++]); 1665 this->evalAt(t, &pts[count++]);
1661 } 1666 }
1662 bounds->set(pts, count); 1667 bounds->set(pts, count);
1663 } 1668 }
1664 1669
1665 void SkConic::computeFastBounds(SkRect* bounds) const { 1670 void SkConic::computeFastBounds(SkRect* bounds) const {
1666 bounds->set(fPts, 3); 1671 bounds->set(fPts, 3);
1667 } 1672 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698