• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 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 
8 #ifndef SkPathOpsConic_DEFINED
9 #define SkPathOpsConic_DEFINED
10 
11 #include "SkPathOpsPoint.h"
12 #include "SkPathOpsQuad.h"
13 
14 struct SkDConic {
15     static const int kPointCount = 3;
16     static const int kPointLast = kPointCount - 1;
17     static const int kMaxIntersections = 4;
18 
19     SkDQuad fPts;
20     SkScalar fWeight;
21 
collapsedSkDConic22     bool collapsed() const {
23         return fPts.collapsed();
24     }
25 
controlsInsideSkDConic26     bool controlsInside() const {
27         return fPts.controlsInside();
28     }
29 
debugInitSkDConic30     void debugInit() {
31         fPts.debugInit();
32     }
33 
34     void debugSet(const SkDPoint* pts, SkScalar weight);
35 
flipSkDConic36     SkDConic flip() const {
37         SkDConic result = {{{fPts[2], fPts[1], fPts[0]}
38                 SkDEBUGPARAMS(fPts.fDebugGlobalState) }, fWeight};
39         return result;
40     }
41 
42 #ifdef SK_DEBUG
globalStateSkDConic43     SkOpGlobalState* globalState() const { return fPts.globalState(); }
44 #endif
45 
IsConicSkDConic46     static bool IsConic() { return true; }
47 
setSkDConic48     const SkDConic& set(const SkPoint pts[kPointCount], SkScalar weight
49             SkDEBUGPARAMS(SkOpGlobalState* state = nullptr)) {
50         fPts.set(pts  SkDEBUGPARAMS(state));
51         fWeight = weight;
52         return *this;
53     }
54 
55     const SkDPoint& operator[](int n) const { return fPts[n]; }
56     SkDPoint& operator[](int n) { return fPts[n]; }
57 
AddValidTsSkDConic58     static int AddValidTs(double s[], int realRoots, double* t) {
59         return SkDQuad::AddValidTs(s, realRoots, t);
60     }
61 
alignSkDConic62     void align(int endIndex, SkDPoint* dstPt) const {
63         fPts.align(endIndex, dstPt);
64     }
65 
66     SkDVector dxdyAtT(double t) const;
67     static int FindExtrema(const double src[], SkScalar weight, double tValue[1]);
68 
hullIntersectsSkDConic69     bool hullIntersects(const SkDQuad& quad, bool* isLinear) const {
70         return fPts.hullIntersects(quad, isLinear);
71     }
72 
hullIntersectsSkDConic73     bool hullIntersects(const SkDConic& conic, bool* isLinear) const {
74         return fPts.hullIntersects(conic.fPts, isLinear);
75     }
76 
77     bool hullIntersects(const SkDCubic& cubic, bool* isLinear) const;
78 
isLinearSkDConic79     bool isLinear(int startIndex, int endIndex) const {
80         return fPts.isLinear(startIndex, endIndex);
81     }
82 
monotonicInXSkDConic83     bool monotonicInX() const {
84         return fPts.monotonicInX();
85     }
86 
monotonicInYSkDConic87     bool monotonicInY() const {
88         return fPts.monotonicInY();
89     }
90 
otherPtsSkDConic91     void otherPts(int oddMan, const SkDPoint* endPt[2]) const {
92         fPts.otherPts(oddMan, endPt);
93     }
94 
95     SkDPoint ptAtT(double t) const;
96 
RootsRealSkDConic97     static int RootsReal(double A, double B, double C, double t[2]) {
98         return SkDQuad::RootsReal(A, B, C, t);
99     }
100 
RootsValidTSkDConic101     static int RootsValidT(const double A, const double B, const double C, double s[2]) {
102         return SkDQuad::RootsValidT(A, B, C, s);
103     }
104 
105     SkDConic subDivide(double t1, double t2) const;
106 
SubDivideSkDConic107     static SkDConic SubDivide(const SkPoint a[kPointCount], SkScalar weight, double t1, double t2) {
108         SkDConic conic;
109         conic.set(a, weight);
110         return conic.subDivide(t1, t2);
111     }
112 
113     SkDPoint subDivide(const SkDPoint& a, const SkDPoint& c, double t1, double t2,
114             SkScalar* weight) const;
115 
SubDivideSkDConic116     static SkDPoint SubDivide(const SkPoint pts[kPointCount], SkScalar weight,
117                               const SkDPoint& a, const SkDPoint& c,
118                               double t1, double t2, SkScalar* newWeight) {
119         SkDConic conic;
120         conic.set(pts, weight);
121         return conic.subDivide(a, c, t1, t2, newWeight);
122     }
123 
124     // utilities callable by the user from the debugger when the implementation code is linked in
125     void dump() const;
126     void dumpID(int id) const;
127     void dumpInner() const;
128 
129 };
130 
131 
132 #endif
133