xref: /aosp_15_r20/external/skia/src/core/SkEdgeBuilder.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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