Lines Matching refs:edge
19 SkEdgeBuilder::Combine SkBasicEdgeBuilder::combineVertical(const SkEdge* edge, SkEdge* last) {
20 if (last->fCurveCount || last->fDX || edge->fX != last->fX) {
23 if (edge->fWinding == last->fWinding) {
24 if (edge->fLastY + 1 == last->fFirstY) {
25 last->fFirstY = edge->fFirstY;
28 if (edge->fFirstY == last->fLastY + 1) {
29 last->fLastY = edge->fLastY;
34 if (edge->fFirstY == last->fFirstY) {
35 if (edge->fLastY == last->fLastY) {
38 if (edge->fLastY < last->fLastY) {
39 last->fFirstY = edge->fLastY + 1;
43 last->fLastY = edge->fLastY;
44 last->fWinding = edge->fWinding;
47 if (edge->fLastY == last->fLastY) {
48 if (edge->fFirstY > last->fFirstY) {
49 last->fLastY = edge->fFirstY - 1;
53 last->fFirstY = edge->fFirstY;
54 last->fWinding = edge->fWinding;
60 SkEdgeBuilder::Combine SkAnalyticEdgeBuilder::combineVertical(const SkAnalyticEdge* edge,
66 if (last->fCurveCount || last->fDX || edge->fX != last->fX) {
69 if (edge->fWinding == last->fWinding) {
70 if (edge->fLowerY == last->fUpperY) {
71 last->fUpperY = edge->fUpperY;
75 if (approximately_equal(edge->fUpperY, last->fLowerY)) {
76 last->fLowerY = edge->fLowerY;
81 if (approximately_equal(edge->fUpperY, last->fUpperY)) {
82 if (approximately_equal(edge->fLowerY, last->fLowerY)) {
85 if (edge->fLowerY < last->fLowerY) {
86 last->fUpperY = edge->fLowerY;
92 last->fLowerY = edge->fLowerY;
93 last->fWinding = edge->fWinding;
96 if (approximately_equal(edge->fLowerY, last->fLowerY)) {
97 if (edge->fUpperY > last->fUpperY) {
98 last->fLowerY = edge->fUpperY;
102 last->fUpperY = edge->fUpperY;
104 last->fWinding = edge->fWinding;
111 static bool is_vertical(const Edge* edge) {
112 return edge->fDX == 0
113 && edge->fCurveCount == 0;
116 // TODO: we can deallocate the edge if edge->setFoo() fails
120 SkEdge* edge = fAlloc.make<SkEdge>();
121 if (edge->setLine(pts[0], pts[1], fClipShift)) {
122 Combine combine = is_vertical(edge) && !fList.empty()
123 ? this->combineVertical(edge, (SkEdge*)fList.top())
129 case kNo_Combine: fList.push_back(edge); break;
134 SkAnalyticEdge* edge = fAlloc.make<SkAnalyticEdge>();
135 if (edge->setLine(pts[0], pts[1])) {
137 Combine combine = is_vertical(edge) && !fList.empty()
138 ? this->combineVertical(edge, (SkAnalyticEdge*)fList.top())
144 case kNo_Combine: fList.push_back(edge); break;
149 SkQuadraticEdge* edge = fAlloc.make<SkQuadraticEdge>();
150 if (edge->setQuadratic(pts, fClipShift)) {
151 fList.push_back(edge);
155 SkAnalyticQuadraticEdge* edge = fAlloc.make<SkAnalyticQuadraticEdge>();
156 if (edge->setQuadratic(pts)) {
157 fList.push_back(edge);
162 SkCubicEdge* edge = fAlloc.make<SkCubicEdge>();
163 if (edge->setCubic(pts, fClipShift)) {
164 fList.push_back(edge);
168 SkAnalyticCubicEdge* edge = fAlloc.make<SkAnalyticCubicEdge>();
169 if (edge->setCubic(pts)) {
170 fList.push_back(edge);
178 auto edge = (SkEdge*) arg_edge;
181 if (edge->setLine(pts[0], pts[1], fClipShift)) {
182 return is_vertical(edge) && edgePtr > (SkEdge**)fEdgeList
183 ? this->combineVertical(edge, edgePtr[-1])
190 auto edge = (SkAnalyticEdge*) arg_edge;
193 if (edge->setLine(pts[0], pts[1])) {
194 return is_vertical(edge) && edgePtr > (SkAnalyticEdge**)fEdgeList
195 ? this->combineVertical(edge, edgePtr[-1])
235 char* edge = this->allocEdges(maxEdgeCount, &edgeSize);
237 SkDEBUGCODE(char* edgeStart = edge);
252 switch( this->addPolyLine(lines + i, edge, edgePtr) ) {
255 case kNo_Combine: *edgePtr++ = edge;
256 edge += edgeSize;
270 switch( this->addPolyLine(e.fPts, edge, edgePtr) ) {
273 case kNo_Combine: *edgePtr++ = edge;
274 edge += edgeSize;
284 SkASSERT((size_t)(edge - edgeStart) <= maxEdgeCount * edgeSize);
365 // If we're convex, then we need both edges, even if the right edge is past the clip.