1 /* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #ifndef SkEdgeBuilder_DEFINED 8 #define SkEdgeBuilder_DEFINED 9 10 #include "include/core/SkRect.h" 11 #include "include/private/base/SkTDArray.h" 12 #include "src/base/SkArenaAlloc.h" 13 14 #include <cstddef> 15 16 class SkPath; 17 struct SkAnalyticEdge; 18 struct SkEdge; 19 struct SkPoint; 20 21 class SkEdgeBuilder { 22 public: 23 int buildEdges(const SkPath& path, 24 const SkIRect* shiftedClip); 25 26 protected: 27 SkEdgeBuilder() = default; 28 virtual ~SkEdgeBuilder() = default; 29 30 // In general mode we allocate pointers in fList and fEdgeList points to its head. 31 // In polygon mode we preallocated edges contiguously in fAlloc and fEdgeList points there. 32 void** fEdgeList = nullptr; 33 SkTDArray<void*> fList; 34 SkSTArenaAlloc<512> fAlloc; 35 36 enum Combine { 37 kNo_Combine, 38 kPartial_Combine, 39 kTotal_Combine 40 }; 41 42 private: 43 int build (const SkPath& path, const SkIRect* clip, bool clipToTheRight); 44 int buildPoly(const SkPath& path, const SkIRect* clip, bool clipToTheRight); 45 46 virtual char* allocEdges(size_t n, size_t* sizeof_edge) = 0; 47 virtual SkRect recoverClip(const SkIRect&) const = 0; 48 49 virtual void addLine (const SkPoint pts[]) = 0; 50 virtual void addQuad (const SkPoint pts[]) = 0; 51 virtual void addCubic(const SkPoint pts[]) = 0; 52 virtual Combine addPolyLine(const SkPoint pts[], char* edge, char** edgePtr) = 0; 53 }; 54 55 class SkBasicEdgeBuilder final : public SkEdgeBuilder { 56 public: SkBasicEdgeBuilder(int clipShift)57 explicit SkBasicEdgeBuilder(int clipShift) : fClipShift(clipShift) {} 58 edgeList()59 SkEdge** edgeList() { return (SkEdge**)fEdgeList; } 60 61 private: 62 Combine combineVertical(const SkEdge* edge, SkEdge* last); 63 64 char* allocEdges(size_t, size_t*) override; 65 SkRect recoverClip(const SkIRect&) const override; 66 67 void addLine (const SkPoint pts[]) override; 68 void addQuad (const SkPoint pts[]) override; 69 void addCubic(const SkPoint pts[]) override; 70 Combine addPolyLine(const SkPoint pts[], char* edge, char** edgePtr) override; 71 72 const int fClipShift; 73 }; 74 75 class SkAnalyticEdgeBuilder final : public SkEdgeBuilder { 76 public: SkAnalyticEdgeBuilder()77 SkAnalyticEdgeBuilder() {} 78 analyticEdgeList()79 SkAnalyticEdge** analyticEdgeList() { return (SkAnalyticEdge**)fEdgeList; } 80 81 private: 82 Combine combineVertical(const SkAnalyticEdge* edge, SkAnalyticEdge* last); 83 84 char* allocEdges(size_t, size_t*) override; 85 SkRect recoverClip(const SkIRect&) const override; 86 87 void addLine (const SkPoint pts[]) override; 88 void addQuad (const SkPoint pts[]) override; 89 void addCubic(const SkPoint pts[]) override; 90 Combine addPolyLine(const SkPoint pts[], char* edge, char** edgePtr) override; 91 }; 92 #endif 93