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