| Index: src/pathops/SkIntersectionHelper.h
|
| ===================================================================
|
| --- src/pathops/SkIntersectionHelper.h (revision 0)
|
| +++ src/pathops/SkIntersectionHelper.h (revision 0)
|
| @@ -0,0 +1,139 @@
|
| +/*
|
| + * 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 "SkOpContour.h"
|
| +#include "SkPath.h"
|
| +
|
| +class SkIntersectionHelper {
|
| +public:
|
| + enum SegmentType {
|
| + kHorizontalLine_Segment = -1,
|
| + kVerticalLine_Segment = 0,
|
| + kLine_Segment = SkPath::kLine_Verb,
|
| + kQuad_Segment = SkPath::kQuad_Verb,
|
| + kCubic_Segment = SkPath::kCubic_Verb,
|
| + };
|
| +
|
| + void addCoincident(SkIntersectionHelper& other, const SkIntersections& ts, bool swap) {
|
| + fContour->addCoincident(fIndex, other.fContour, other.fIndex, ts, swap);
|
| + }
|
| +
|
| + // FIXME: does it make sense to write otherIndex now if we're going to
|
| + // fix it up later?
|
| + void addOtherT(int index, double otherT, int otherIndex) {
|
| + fContour->addOtherT(fIndex, index, otherT, otherIndex);
|
| + }
|
| +
|
| + // Avoid collapsing t values that are close to the same since
|
| + // we walk ts to describe consecutive intersections. Since a pair of ts can
|
| + // be nearly equal, any problems caused by this should be taken care
|
| + // of later.
|
| + // On the edge or out of range values are negative; add 2 to get end
|
| + int addT(const SkIntersectionHelper& other, const SkPoint& pt, double newT) {
|
| + return fContour->addT(fIndex, other.fContour, other.fIndex, pt, newT);
|
| + }
|
| +
|
| + int addSelfT(const SkIntersectionHelper& other, const SkPoint& pt, double newT) {
|
| + return fContour->addSelfT(fIndex, other.fContour, other.fIndex, pt, newT);
|
| + }
|
| +
|
| + int addUnsortableT(const SkIntersectionHelper& other, bool start, const SkPoint& pt,
|
| + double newT) {
|
| + return fContour->addUnsortableT(fIndex, other.fContour, other.fIndex, start, pt, newT);
|
| + }
|
| +
|
| + bool advance() {
|
| + return ++fIndex < fLast;
|
| + }
|
| +
|
| + SkScalar bottom() const {
|
| + return bounds().fBottom;
|
| + }
|
| +
|
| + const SkPathOpsBounds& bounds() const {
|
| + return fContour->segments()[fIndex].bounds();
|
| + }
|
| +
|
| + void init(SkOpContour* contour) {
|
| + fContour = contour;
|
| + fIndex = 0;
|
| + fLast = contour->segments().count();
|
| + }
|
| +
|
| + bool isAdjacent(const SkIntersectionHelper& next) {
|
| + return fContour == next.fContour && fIndex + 1 == next.fIndex;
|
| + }
|
| +
|
| + bool isFirstLast(const SkIntersectionHelper& next) {
|
| + return fContour == next.fContour && fIndex == 0
|
| + && next.fIndex == fLast - 1;
|
| + }
|
| +
|
| + SkScalar left() const {
|
| + return bounds().fLeft;
|
| + }
|
| +
|
| + const SkPoint* pts() const {
|
| + return fContour->segments()[fIndex].pts();
|
| + }
|
| +
|
| + SkScalar right() const {
|
| + return bounds().fRight;
|
| + }
|
| +
|
| + ptrdiff_t segmentIndex() const {
|
| + return fIndex;
|
| + }
|
| +
|
| + SegmentType segmentType() const {
|
| + const SkOpSegment& segment = fContour->segments()[fIndex];
|
| + SegmentType type = (SegmentType) segment.verb();
|
| + if (type != kLine_Segment) {
|
| + return type;
|
| + }
|
| + if (segment.isHorizontal()) {
|
| + return kHorizontalLine_Segment;
|
| + }
|
| + if (segment.isVertical()) {
|
| + return kVerticalLine_Segment;
|
| + }
|
| + return kLine_Segment;
|
| + }
|
| +
|
| + bool startAfter(const SkIntersectionHelper& after) {
|
| + fIndex = after.fIndex;
|
| + return advance();
|
| + }
|
| +
|
| + SkScalar top() const {
|
| + return bounds().fTop;
|
| + }
|
| +
|
| + SkPath::Verb verb() const {
|
| + return fContour->segments()[fIndex].verb();
|
| + }
|
| +
|
| + 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:
|
| + SkOpContour* fContour;
|
| + int fIndex;
|
| + int fLast;
|
| +};
|
|
|