/* * 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 SkOpAngle_DEFINED #define SkOpAngle_DEFINED #include "SkLineParameters.h" #include "SkPath.h" #include "SkPathOpsCubic.h" class SkOpSegment; struct SkOpSpan; // sorting angles // given angles of {dx dy ddx ddy dddx dddy} sort them class SkOpAngle { public: enum { kStackBasedCount = 8 }; // FIXME: determine what this should be enum IncludeType { kUnaryWinding, kUnaryXor, kBinarySingle, kBinaryOpp, }; bool operator<(const SkOpAngle& rh) const; bool calcSlop(double x, double y, double rx, double ry, bool* result) const; double dx() const { return fTangentPart.dx(); } double dy() const { return fTangentPart.dy(); } int end() const { return fEnd; } bool isHorizontal() const; SkOpSpan* lastMarked() const { return fLastMarked; } void set(const SkOpSegment* segment, int start, int end); void setLastMarked(SkOpSpan* marked) { fLastMarked = marked; } SkOpSegment* segment() const { return const_cast<SkOpSegment*>(fSegment); } int sign() const { return SkSign32(fStart - fEnd); } int start() const { return fStart; } bool unorderable() const { return fUnorderable; } bool unsortable() const { return fUnsortable; } #ifdef SK_DEBUG void dump() const; #endif #if DEBUG_ANGLE void setID(int id) { fID = id; } #endif private: bool lengthen(const SkOpAngle& ); void setSpans(); SkDCubic fCurvePart; // the curve from start to end SkDCubic fCurveHalf; // the curve from start to 1 or 0 double fSide; double fSide2; SkLineParameters fTangentPart; SkLineParameters fTangentHalf; const SkOpSegment* fSegment; SkOpSpan* fLastMarked; int fStart; int fEnd; bool fComputed; // tangent is computed, may contain some error // if subdividing a quad or cubic causes the tangent to go from the maximum angle to the // minimum, mark it unorderable. It still can be sorted, which is good enough for find-top // but can't be ordered, and therefore can't be used to compute winding bool fUnorderable; mutable bool fUnsortable; // this alone is editable by the less than operator #if DEBUG_ANGLE int fID; #endif }; #endif