/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkPathOpsConic.h" #include "SkPathOpsCubic.h" #include "SkPathOpsLine.h" #include "SkPathOpsQuad.h" #include "SkPathOpsRect.h" void SkDRect::setBounds(const SkDQuad& curve, const SkDQuad& sub, double startT, double endT) { set(sub[0]); add(sub[2]); double tValues[2]; int roots = 0; if (!sub.monotonicInX()) { roots = SkDQuad::FindExtrema(&sub[0].fX, tValues); } if (!sub.monotonicInY()) { roots += SkDQuad::FindExtrema(&sub[0].fY, &tValues[roots]); } for (int index = 0; index < roots; ++index) { double t = startT + (endT - startT) * tValues[index]; add(curve.ptAtT(t)); } } void SkDRect::setBounds(const SkDConic& curve, const SkDConic& sub, double startT, double endT) { set(sub[0]); add(sub[2]); double tValues[2]; int roots = 0; if (!sub.monotonicInX()) { roots = SkDConic::FindExtrema(&sub[0].fX, sub.fWeight, tValues); } if (!sub.monotonicInY()) { roots += SkDConic::FindExtrema(&sub[0].fY, sub.fWeight, &tValues[roots]); } for (int index = 0; index < roots; ++index) { double t = startT + (endT - startT) * tValues[index]; add(curve.ptAtT(t)); } } void SkDRect::setBounds(const SkDCubic& curve, const SkDCubic& sub, double startT, double endT) { set(sub[0]); add(sub[3]); double tValues[4]; int roots = 0; if (!sub.monotonicInX()) { roots = SkDCubic::FindExtrema(&sub[0].fX, tValues); } if (!sub.monotonicInY()) { roots += SkDCubic::FindExtrema(&sub[0].fY, &tValues[roots]); } for (int index = 0; index < roots; ++index) { double t = startT + (endT - startT) * tValues[index]; add(curve.ptAtT(t)); } }