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