| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2008 The Android Open Source Project | 2 * Copyright 2008 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkStrokerPriv.h" | 8 #include "SkStrokerPriv.h" |
| 9 #include "SkGeometry.h" | 9 #include "SkGeometry.h" |
| 10 #include "SkPathPriv.h" | 10 #include "SkPathPriv.h" |
| 11 | 11 |
| 12 enum { | 12 enum { |
| 13 kTangent_RecursiveLimit, | 13 kTangent_RecursiveLimit, |
| 14 kCubic_RecursiveLimit, | 14 kCubic_RecursiveLimit, |
| 15 kConic_RecursiveLimit, | 15 kConic_RecursiveLimit, |
| 16 kQuad_RecursiveLimit | 16 kQuad_RecursiveLimit |
| 17 }; | 17 }; |
| 18 | 18 |
| 19 // quads with extreme widths (e.g. (0,1) (1,6) (0,3) width=5e7) recurse to point
of failure | 19 // quads with extreme widths (e.g. (0,1) (1,6) (0,3) width=5e7) recurse to point
of failure |
| 20 // largest seen for normal cubics : 5, 26 | 20 // largest seen for normal cubics : 5, 26 |
| 21 // largest seen for normal quads : 11 | 21 // largest seen for normal quads : 11 |
| 22 static const int kRecursiveLimits[] = { 5*3, 26*3, 11*3, 11*3 }; // 3x limits se
en in practice | 22 static const int kRecursiveLimits[] = { 5*3, 26*3, 11*3, 11*3 }; // 3x limits se
en in practice |
| 23 | 23 |
| 24 SK_COMPILE_ASSERT(0 == kTangent_RecursiveLimit, cubic_stroke_relies_on_tangent_e
qualling_zero); | 24 static_assert(0 == kTangent_RecursiveLimit, "cubic_stroke_relies_on_tangent_equa
lling_zero"); |
| 25 SK_COMPILE_ASSERT(1 == kCubic_RecursiveLimit, cubic_stroke_relies_on_cubic_equal
ling_one); | 25 static_assert(1 == kCubic_RecursiveLimit, "cubic_stroke_relies_on_cubic_equallin
g_one"); |
| 26 SK_COMPILE_ASSERT(SK_ARRAY_COUNT(kRecursiveLimits) == kQuad_RecursiveLimit + 1, | 26 static_assert(SK_ARRAY_COUNT(kRecursiveLimits) == kQuad_RecursiveLimit + 1, |
| 27 recursive_limits_mismatch); | 27 "recursive_limits_mismatch"); |
| 28 | 28 |
| 29 #ifdef SK_DEBUG | 29 #ifdef SK_DEBUG |
| 30 int gMaxRecursion[SK_ARRAY_COUNT(kRecursiveLimits)] = { 0 }; | 30 int gMaxRecursion[SK_ARRAY_COUNT(kRecursiveLimits)] = { 0 }; |
| 31 #endif | 31 #endif |
| 32 #ifndef DEBUG_QUAD_STROKER | 32 #ifndef DEBUG_QUAD_STROKER |
| 33 #define DEBUG_QUAD_STROKER 0 | 33 #define DEBUG_QUAD_STROKER 0 |
| 34 #endif | 34 #endif |
| 35 | 35 |
| 36 #if DEBUG_QUAD_STROKER | 36 #if DEBUG_QUAD_STROKER |
| 37 /* Enable to show the decisions made in subdividing the curve -- helpful whe
n the resulting | 37 /* Enable to show the decisions made in subdividing the curve -- helpful whe
n the resulting |
| (...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 537 } | 537 } |
| 538 SkScalar tValues[3]; | 538 SkScalar tValues[3]; |
| 539 int count = SkFindCubicMaxCurvature(cubic, tValues); | 539 int count = SkFindCubicMaxCurvature(cubic, tValues); |
| 540 if (count == 0) { | 540 if (count == 0) { |
| 541 return kLine_ReductionType; | 541 return kLine_ReductionType; |
| 542 } | 542 } |
| 543 for (int index = 0; index < count; ++index) { | 543 for (int index = 0; index < count; ++index) { |
| 544 SkScalar t = tValues[index]; | 544 SkScalar t = tValues[index]; |
| 545 SkEvalCubicAt(cubic, t, &reduction[index], NULL, NULL); | 545 SkEvalCubicAt(cubic, t, &reduction[index], NULL, NULL); |
| 546 } | 546 } |
| 547 SK_COMPILE_ASSERT(kQuad_ReductionType + 1 == kDegenerate_ReductionType, enum
_out_of_whack); | 547 static_assert(kQuad_ReductionType + 1 == kDegenerate_ReductionType, "enum_ou
t_of_whack"); |
| 548 SK_COMPILE_ASSERT(kQuad_ReductionType + 2 == kDegenerate2_ReductionType, enu
m_out_of_whack); | 548 static_assert(kQuad_ReductionType + 2 == kDegenerate2_ReductionType, "enum_o
ut_of_whack"); |
| 549 SK_COMPILE_ASSERT(kQuad_ReductionType + 3 == kDegenerate3_ReductionType, enu
m_out_of_whack); | 549 static_assert(kQuad_ReductionType + 3 == kDegenerate3_ReductionType, "enum_o
ut_of_whack"); |
| 550 | 550 |
| 551 return (ReductionType) (kQuad_ReductionType + count); | 551 return (ReductionType) (kQuad_ReductionType + count); |
| 552 } | 552 } |
| 553 | 553 |
| 554 SkPathStroker::ReductionType SkPathStroker::CheckConicLinear(const SkConic& coni
c, | 554 SkPathStroker::ReductionType SkPathStroker::CheckConicLinear(const SkConic& coni
c, |
| 555 SkPoint* reduction) { | 555 SkPoint* reduction) { |
| 556 bool degenerateAB = degenerate_vector(conic.fPts[1] - conic.fPts[0]); | 556 bool degenerateAB = degenerate_vector(conic.fPts[1] - conic.fPts[0]); |
| 557 bool degenerateBC = degenerate_vector(conic.fPts[2] - conic.fPts[1]); | 557 bool degenerateBC = degenerate_vector(conic.fPts[2] - conic.fPts[1]); |
| 558 if (degenerateAB & degenerateBC) { | 558 if (degenerateAB & degenerateBC) { |
| 559 return kPoint_ReductionType; | 559 return kPoint_ReductionType; |
| (...skipping 890 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1450 default: | 1450 default: |
| 1451 break; | 1451 break; |
| 1452 } | 1452 } |
| 1453 | 1453 |
| 1454 if (fWidth < SkMinScalar(rw, rh) && !fDoFill) { | 1454 if (fWidth < SkMinScalar(rw, rh) && !fDoFill) { |
| 1455 r = rect; | 1455 r = rect; |
| 1456 r.inset(radius, radius); | 1456 r.inset(radius, radius); |
| 1457 dst->addRect(r, reverse_direction(dir)); | 1457 dst->addRect(r, reverse_direction(dir)); |
| 1458 } | 1458 } |
| 1459 } | 1459 } |
| OLD | NEW |