/*
|
* Copyright 2012 Google Inc.
|
*
|
* Use of this source code is governed by a BSD-style license that can be
|
* found in the LICENSE file.
|
*/
|
#ifndef SkIntersectionHelper_DEFINED
|
#define SkIntersectionHelper_DEFINED
|
|
#include "SkOpContour.h"
|
#include "SkOpSegment.h"
|
#include "SkPath.h"
|
|
#ifdef SK_DEBUG
|
#include "SkPathOpsPoint.h"
|
#endif
|
|
class SkIntersectionHelper {
|
public:
|
enum SegmentType {
|
kHorizontalLine_Segment = -1,
|
kVerticalLine_Segment = 0,
|
kLine_Segment = SkPath::kLine_Verb,
|
kQuad_Segment = SkPath::kQuad_Verb,
|
kConic_Segment = SkPath::kConic_Verb,
|
kCubic_Segment = SkPath::kCubic_Verb,
|
};
|
|
bool advance() {
|
fSegment = fSegment->next();
|
return fSegment != nullptr;
|
}
|
|
SkScalar bottom() const {
|
return bounds().fBottom;
|
}
|
|
const SkPathOpsBounds& bounds() const {
|
return fSegment->bounds();
|
}
|
|
SkOpContour* contour() const {
|
return fSegment->contour();
|
}
|
|
void init(SkOpContour* contour) {
|
fSegment = contour->first();
|
}
|
|
SkScalar left() const {
|
return bounds().fLeft;
|
}
|
|
const SkPoint* pts() const {
|
return fSegment->pts();
|
}
|
|
SkScalar right() const {
|
return bounds().fRight;
|
}
|
|
SkOpSegment* segment() const {
|
return fSegment;
|
}
|
|
SegmentType segmentType() const {
|
SegmentType type = (SegmentType) fSegment->verb();
|
if (type != kLine_Segment) {
|
return type;
|
}
|
if (fSegment->isHorizontal()) {
|
return kHorizontalLine_Segment;
|
}
|
if (fSegment->isVertical()) {
|
return kVerticalLine_Segment;
|
}
|
return kLine_Segment;
|
}
|
|
bool startAfter(const SkIntersectionHelper& after) {
|
fSegment = after.fSegment->next();
|
return fSegment != nullptr;
|
}
|
|
SkScalar top() const {
|
return bounds().fTop;
|
}
|
|
SkScalar weight() const {
|
return fSegment->weight();
|
}
|
|
SkScalar x() const {
|
return bounds().fLeft;
|
}
|
|
bool xFlipped() const {
|
return x() != pts()[0].fX;
|
}
|
|
SkScalar y() const {
|
return bounds().fTop;
|
}
|
|
bool yFlipped() const {
|
return y() != pts()[0].fY;
|
}
|
|
private:
|
SkOpSegment* fSegment;
|
};
|
|
#endif
|