Home | History | Annotate | Download | only in pathops
      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 
     14 class 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 
     20 class SkPathWriter {
     21 public:
     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 
     35 private:
     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