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 "SkPathOpsConic.h"
8#include "SkPathOpsCubic.h"
9#include "SkPathOpsLine.h"
10#include "SkPathOpsQuad.h"
11#include "SkPathOpsRect.h"
12
13void 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
30void 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
47void 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