| /* | |
| * 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 SkPathWriter_DEFINED | |
| #define SkPathWriter_DEFINED | |
| #include "include/core/SkPath.h" | |
| #include "include/private/SkTArray.h" | |
| #include "include/private/SkTDArray.h" | |
| class SkOpPtT; | |
| // Construct the path one contour at a time. | |
| // If the contour is closed, copy it to the final output. | |
| // Otherwise, keep the partial contour for later assembly. | |
| class SkPathWriter { | |
| public: | |
| SkPathWriter(SkPath& path); | |
| void assemble(); | |
| void conicTo(const SkPoint& pt1, const SkOpPtT* pt2, SkScalar weight); | |
| void cubicTo(const SkPoint& pt1, const SkPoint& pt2, const SkOpPtT* pt3); | |
| bool deferredLine(const SkOpPtT* pt); | |
| void deferredMove(const SkOpPtT* pt); | |
| void finishContour(); | |
| bool hasMove() const { return !fFirstPtT; } | |
| void init(); | |
| bool isClosed() const; | |
| const SkPath* nativePath() const { return fPathPtr; } | |
| void quadTo(const SkPoint& pt1, const SkOpPtT* pt2); | |
| private: | |
| bool changedSlopes(const SkOpPtT* pt) const; | |
| void close(); | |
| const SkTDArray<const SkOpPtT*>& endPtTs() const { return fEndPtTs; } | |
| void lineTo(); | |
| bool matchedLast(const SkOpPtT*) const; | |
| void moveTo(); | |
| const SkTArray<SkPath>& partials() const { return fPartials; } | |
| bool someAssemblyRequired(); | |
| SkPoint update(const SkOpPtT* pt); | |
| SkPath fCurrent; // contour under construction | |
| SkTArray<SkPath> fPartials; // contours with mismatched starts and ends | |
| SkTDArray<const SkOpPtT*> fEndPtTs; // possible pt values for partial starts and ends | |
| SkPath* fPathPtr; // closed contours are written here | |
| const SkOpPtT* fDefer[2]; // [0] deferred move, [1] deferred line | |
| const SkOpPtT* fFirstPtT; // first in current contour | |
| }; | |
| #endif /* defined(__PathOps__SkPathWriter__) */ |