1/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7#ifndef SkPathWriter_DEFINED
8#define SkPathWriter_DEFINED
9
10#include "SkPath.h"
11#include "SkTArray.h"
12#include "SkTDArray.h"
13
14class SkOpPtT;
15
16// Construct the path one contour at a time.
17// If the contour is closed, copy it to the final output.
18// Otherwise, keep the partial contour for later assembly.
19
20class SkPathWriter {
21public:
22    SkPathWriter(SkPath& path);
23    void assemble();
24    void conicTo(const SkPoint& pt1, const SkOpPtT* pt2, SkScalar weight);
25    void cubicTo(const SkPoint& pt1, const SkPoint& pt2, const SkOpPtT* pt3);
26    bool deferredLine(const SkOpPtT* pt);
27    void deferredMove(const SkOpPtT* pt);
28    void finishContour();
29    bool hasMove() const { return !fFirstPtT; }
30    void init();
31    bool isClosed() const;
32    const SkPath* nativePath() const { return fPathPtr; }
33    void quadTo(const SkPoint& pt1, const SkOpPtT* pt2);
34
35private:
36    bool changedSlopes(const SkOpPtT* pt) const;
37    void close();
38    const SkTDArray<const SkOpPtT*>& endPtTs() const { return fEndPtTs; }
39    void lineTo();
40    bool matchedLast(const SkOpPtT*) const;
41    void moveTo();
42    const SkTArray<SkPath>& partials() const { return fPartials; }
43    bool someAssemblyRequired();
44    void update(const SkOpPtT* pt);
45
46    SkPath fCurrent;  // contour under construction
47    SkTArray<SkPath> fPartials;   // contours with mismatched starts and ends
48    SkTDArray<const SkOpPtT*> fEndPtTs;  // possible pt values for partial starts and ends
49    SkPath* fPathPtr;  // closed contours are written here
50    const SkOpPtT* fDefer[2];  // [0] deferred move, [1] deferred line
51    const SkOpPtT* fFirstPtT;  // first in current contour
52};
53
54#endif /* defined(__PathOps__SkPathWriter__) */
55