17839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/*
27839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Copyright 2012 Google Inc.
37839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *
47839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be
57839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * found in the LICENSE file.
67839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */
77839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#ifndef SkOpEdgeBuilder_DEFINED
87839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define SkOpEdgeBuilder_DEFINED
97839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkOpContour.h"
117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkPathWriter.h"
127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkTArray.h"
137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass SkOpEdgeBuilder {
157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkOpEdgeBuilder(const SkPathWriter& path, SkTArray<SkOpContour>& contours)
177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        : fPath(path.nativePath())
187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        , fContours(contours)
197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        , fAllowOpenContours(true) {
207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        init();
217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkOpEdgeBuilder(const SkPath& path, SkTArray<SkOpContour>& contours)
247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        : fPath(&path)
257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        , fContours(contours)
267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        , fAllowOpenContours(false) {
277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        init();
287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void complete() {
317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (fCurrentContour && fCurrentContour->segments().count()) {
327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fCurrentContour->complete();
337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fCurrentContour = NULL;
347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkPathOpsMask xorMask() const {
387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return fXorMask[fOperand];
397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void addOperand(const SkPath& path);
427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    bool finish();
437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void init();
447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
4658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    void closeContour(const SkPoint& curveEnd, const SkPoint& curveStart);
477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    bool close();
487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    int preFetch();
497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    bool walk();
507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    const SkPath* fPath;
5258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkTArray<SkPoint, true> fPathPts;
5358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkTArray<uint8_t, true> fPathVerbs;
547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkOpContour* fCurrentContour;
557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkTArray<SkOpContour>& fContours;
567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkPathOpsMask fXorMask[2];
577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    int fSecondHalf;
587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    bool fOperand;
597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    bool fAllowOpenContours;
607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    bool fUnparseable;
617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#endif
64