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