107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/*
207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * Copyright 2012 Google Inc.
307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com *
407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * Use of this source code is governed by a BSD-style license that can be
507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * found in the LICENSE file.
607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com */
707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#ifndef SkOpEdgeBuilder_DEFINED
807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#define SkOpEdgeBuilder_DEFINED
907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
1007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkOpContour.h"
1107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkPathWriter.h"
1207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
1307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comclass SkOpEdgeBuilder {
1407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.compublic:
15eed356d281adbf93ecbd89cb23913a7861cd8578caryclark    SkOpEdgeBuilder(const SkPathWriter& path, SkOpContourHead* contours2,
16eed356d281adbf93ecbd89cb23913a7861cd8578caryclark            SkOpGlobalState* globalState)
1755888e44171ffd48b591d19256884a969fe4da17caryclark        : fGlobalState(globalState)
1854359294a7c9dc54802d512a5d891a35c1663392caryclark        , fPath(path.nativePath())
19ff11428526843d3e03feb6843bd21f2d80536415Cary Clark        , fContourBuilder(contours2)
2054359294a7c9dc54802d512a5d891a35c1663392caryclark        , fContoursHead(contours2)
2166560ca776773858abfffd59974eac32c942acc3caryclark@google.com        , fAllowOpenContours(true) {
2207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        init();
2307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    }
2407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
25eed356d281adbf93ecbd89cb23913a7861cd8578caryclark    SkOpEdgeBuilder(const SkPath& path, SkOpContourHead* contours2, SkOpGlobalState* globalState)
2655888e44171ffd48b591d19256884a969fe4da17caryclark        : fGlobalState(globalState)
2754359294a7c9dc54802d512a5d891a35c1663392caryclark        , fPath(&path)
28ff11428526843d3e03feb6843bd21f2d80536415Cary Clark        , fContourBuilder(contours2)
2954359294a7c9dc54802d512a5d891a35c1663392caryclark        , fContoursHead(contours2)
3066560ca776773858abfffd59974eac32c942acc3caryclark@google.com        , fAllowOpenContours(false) {
3107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        init();
3207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    }
3307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
34d751ac01a3a887bc2d71146fc7353a5f33730043caryclark    void addOperand(const SkPath& path);
35d751ac01a3a887bc2d71146fc7353a5f33730043caryclark
3607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    void complete() {
37ff11428526843d3e03feb6843bd21f2d80536415Cary Clark        fContourBuilder.flush();
38ff11428526843d3e03feb6843bd21f2d80536415Cary Clark        SkOpContour* contour = fContourBuilder.contour();
39ff11428526843d3e03feb6843bd21f2d80536415Cary Clark        if (contour && contour->count()) {
40ff11428526843d3e03feb6843bd21f2d80536415Cary Clark            contour->complete();
41ff11428526843d3e03feb6843bd21f2d80536415Cary Clark            fContourBuilder.setContour(nullptr);
4207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        }
4307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    }
4407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
4555888e44171ffd48b591d19256884a969fe4da17caryclark    bool finish();
4654359294a7c9dc54802d512a5d891a35c1663392caryclark
4754359294a7c9dc54802d512a5d891a35c1663392caryclark    const SkOpContour* head() const {
4854359294a7c9dc54802d512a5d891a35c1663392caryclark        return fContoursHead;
4954359294a7c9dc54802d512a5d891a35c1663392caryclark    }
5054359294a7c9dc54802d512a5d891a35c1663392caryclark
5107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    void init();
52d751ac01a3a887bc2d71146fc7353a5f33730043caryclark    bool unparseable() const { return fUnparseable; }
53d751ac01a3a887bc2d71146fc7353a5f33730043caryclark    SkPathOpsMask xorMask() const { return fXorMask[fOperand]; }
5407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
5507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comprivate:
5607e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com    void closeContour(const SkPoint& curveEnd, const SkPoint& curveStart);
5766560ca776773858abfffd59974eac32c942acc3caryclark@google.com    bool close();
5807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    int preFetch();
5955888e44171ffd48b591d19256884a969fe4da17caryclark    bool walk();
6007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
6154359294a7c9dc54802d512a5d891a35c1663392caryclark    SkOpGlobalState* fGlobalState;
6207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    const SkPath* fPath;
6354359294a7c9dc54802d512a5d891a35c1663392caryclark    SkTDArray<SkPoint> fPathPts;
641049f1246e7be4ccb68001361efceb8933e6f81ccaryclark    SkTDArray<SkScalar> fWeights;
6554359294a7c9dc54802d512a5d891a35c1663392caryclark    SkTDArray<uint8_t> fPathVerbs;
66ff11428526843d3e03feb6843bd21f2d80536415Cary Clark    SkOpContourBuilder fContourBuilder;
67eed356d281adbf93ecbd89cb23913a7861cd8578caryclark    SkOpContourHead* fContoursHead;
6807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    SkPathOpsMask fXorMask[2];
6907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    int fSecondHalf;
7007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    bool fOperand;
7166560ca776773858abfffd59974eac32c942acc3caryclark@google.com    bool fAllowOpenContours;
7266560ca776773858abfffd59974eac32c942acc3caryclark@google.com    bool fUnparseable;
7307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com};
7407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
7507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#endif
76