1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2012 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci#ifndef SkOpEdgeBuilder_DEFINED 8cb93a386Sopenharmony_ci#define SkOpEdgeBuilder_DEFINED 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "src/pathops/SkOpContour.h" 11cb93a386Sopenharmony_ci#include "src/pathops/SkPathWriter.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_ciclass SkOpEdgeBuilder { 14cb93a386Sopenharmony_cipublic: 15cb93a386Sopenharmony_ci SkOpEdgeBuilder(const SkPathWriter& path, SkOpContourHead* contours2, 16cb93a386Sopenharmony_ci SkOpGlobalState* globalState) 17cb93a386Sopenharmony_ci : fGlobalState(globalState) 18cb93a386Sopenharmony_ci , fPath(path.nativePath()) 19cb93a386Sopenharmony_ci , fContourBuilder(contours2) 20cb93a386Sopenharmony_ci , fContoursHead(contours2) 21cb93a386Sopenharmony_ci , fAllowOpenContours(true) { 22cb93a386Sopenharmony_ci init(); 23cb93a386Sopenharmony_ci } 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci SkOpEdgeBuilder(const SkPath& path, SkOpContourHead* contours2, SkOpGlobalState* globalState) 26cb93a386Sopenharmony_ci : fGlobalState(globalState) 27cb93a386Sopenharmony_ci , fPath(&path) 28cb93a386Sopenharmony_ci , fContourBuilder(contours2) 29cb93a386Sopenharmony_ci , fContoursHead(contours2) 30cb93a386Sopenharmony_ci , fAllowOpenContours(false) { 31cb93a386Sopenharmony_ci init(); 32cb93a386Sopenharmony_ci } 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci void addOperand(const SkPath& path); 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci void complete() { 37cb93a386Sopenharmony_ci fContourBuilder.flush(); 38cb93a386Sopenharmony_ci SkOpContour* contour = fContourBuilder.contour(); 39cb93a386Sopenharmony_ci if (contour && contour->count()) { 40cb93a386Sopenharmony_ci contour->complete(); 41cb93a386Sopenharmony_ci fContourBuilder.setContour(nullptr); 42cb93a386Sopenharmony_ci } 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci bool finish(); 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci const SkOpContour* head() const { 48cb93a386Sopenharmony_ci return fContoursHead; 49cb93a386Sopenharmony_ci } 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci void init(); 52cb93a386Sopenharmony_ci bool unparseable() const { return fUnparseable; } 53cb93a386Sopenharmony_ci SkPathOpsMask xorMask() const { return fXorMask[fOperand]; } 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ciprivate: 56cb93a386Sopenharmony_ci void closeContour(const SkPoint& curveEnd, const SkPoint& curveStart); 57cb93a386Sopenharmony_ci bool close(); 58cb93a386Sopenharmony_ci int preFetch(); 59cb93a386Sopenharmony_ci bool walk(); 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci SkOpGlobalState* fGlobalState; 62cb93a386Sopenharmony_ci const SkPath* fPath; 63cb93a386Sopenharmony_ci SkTDArray<SkPoint> fPathPts; 64cb93a386Sopenharmony_ci SkTDArray<SkScalar> fWeights; 65cb93a386Sopenharmony_ci SkTDArray<uint8_t> fPathVerbs; 66cb93a386Sopenharmony_ci SkOpContourBuilder fContourBuilder; 67cb93a386Sopenharmony_ci SkOpContourHead* fContoursHead; 68cb93a386Sopenharmony_ci SkPathOpsMask fXorMask[2]; 69cb93a386Sopenharmony_ci int fSecondHalf; 70cb93a386Sopenharmony_ci bool fOperand; 71cb93a386Sopenharmony_ci bool fAllowOpenContours; 72cb93a386Sopenharmony_ci bool fUnparseable; 73cb93a386Sopenharmony_ci}; 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci#endif 76