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 "src/pathops/SkPathOpsConic.h"
8 #include "src/pathops/SkPathOpsCubic.h"
9 #include "src/pathops/SkPathOpsLine.h"
10 #include "src/pathops/SkPathOpsQuad.h"
11 #include "src/pathops/SkPathOpsRect.h"
12
setBounds(const SkDQuad & curve,const SkDQuad & sub,double startT,double endT)13 void SkDRect::setBounds(const SkDQuad& curve, const SkDQuad& sub, double startT, double endT) {
14 set(sub[0]);
15 add(sub[2]);
16 double tValues[2];
17 int roots = 0;
18 if (!sub.monotonicInX()) {
19 roots = SkDQuad::FindExtrema(&sub[0].fX, tValues);
20 }
21 if (!sub.monotonicInY()) {
22 roots += SkDQuad::FindExtrema(&sub[0].fY, &tValues[roots]);
23 }
24 for (int index = 0; index < roots; ++index) {
25 double t = startT + (endT - startT) * tValues[index];
26 add(curve.ptAtT(t));
27 }
28 }
29
setBounds(const SkDConic & curve,const SkDConic & sub,double startT,double endT)30 void SkDRect::setBounds(const SkDConic& curve, const SkDConic& sub, double startT, double endT) {
31 set(sub[0]);
32 add(sub[2]);
33 double tValues[2];
34 int roots = 0;
35 if (!sub.monotonicInX()) {
36 roots = SkDConic::FindExtrema(&sub[0].fX, sub.fWeight, tValues);
37 }
38 if (!sub.monotonicInY()) {
39 roots += SkDConic::FindExtrema(&sub[0].fY, sub.fWeight, &tValues[roots]);
40 }
41 for (int index = 0; index < roots; ++index) {
42 double t = startT + (endT - startT) * tValues[index];
43 add(curve.ptAtT(t));
44 }
45 }
46
setBounds(const SkDCubic & curve,const SkDCubic & sub,double startT,double endT)47 void SkDRect::setBounds(const SkDCubic& curve, const SkDCubic& sub, double startT, double endT) {
48 set(sub[0]);
49 add(sub[3]);
50 double tValues[4];
51 int roots = 0;
52 if (!sub.monotonicInX()) {
53 roots = SkDCubic::FindExtrema(&sub[0].fX, tValues);
54 }
55 if (!sub.monotonicInY()) {
56 roots += SkDCubic::FindExtrema(&sub[0].fY, &tValues[roots]);
57 }
58 for (int index = 0; index < roots; ++index) {
59 double t = startT + (endT - startT) * tValues[index];
60 add(curve.ptAtT(t));
61 }
62 }
63
setBounds(const SkTCurve & curve)64 void SkDRect::setBounds(const SkTCurve& curve) {
65 curve.setBounds(this);
66 }
67