1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 #ifndef SkEdgeBuilder_DEFINED 9 #define SkEdgeBuilder_DEFINED 10 11 #include "SkChunkAlloc.h" 12 #include "SkRect.h" 13 #include "SkTDArray.h" 14 15 struct SkEdge; 16 class SkEdgeClipper; 17 class SkPath; 18 19 class SkEdgeBuilder { 20 public: 21 SkEdgeBuilder(); 22 23 // returns the number of built edges. The array of those edge pointers 24 // is returned from edgeList(). 25 int build(const SkPath& path, const SkIRect* clip, int shiftUp, bool clipToTheRight); 26 edgeList()27 SkEdge** edgeList() { return fEdgeList; } 28 29 private: 30 enum Combine { 31 kNo_Combine, 32 kPartial_Combine, 33 kTotal_Combine 34 }; 35 36 static Combine CombineVertical(const SkEdge* edge, SkEdge* last); 37 Combine checkVertical(const SkEdge* edge, SkEdge** edgePtr); 38 39 SkChunkAlloc fAlloc; 40 SkTDArray<SkEdge*> fList; 41 42 /* 43 * If we're in general mode, we allcoate the pointers in fList, and this 44 * will point at fList.begin(). If we're in polygon mode, fList will be 45 * empty, as we will have preallocated room for the pointers in fAlloc's 46 * block, and fEdgeList will point into that. 47 */ 48 SkEdge** fEdgeList; 49 50 int fShiftUp; 51 52 public: 53 void addLine(const SkPoint pts[]); 54 void addQuad(const SkPoint pts[]); 55 void addCubic(const SkPoint pts[]); 56 void addClipper(SkEdgeClipper*); 57 58 int buildPoly(const SkPath& path, const SkIRect* clip, int shiftUp, bool clipToTheRight); 59 }; 60 61 #endif 62